ImportError: cannot import name 'bisect_left' from partially initialized module 'bisect' (most likely due to a circular import)
LIS의 DP 풀이, 이분탐색 풀이에 대해 공부하다가 본격적으로 문제를 풀어볼까 싶어서 다음과 같이 입력했다.
# bisect.py from bisect import bisect_left, bisect_from nums = [0, 1, 2, 3, 4, 5, 6, 7 , 8, 9] print(bisect_left(nums, 5))
그리고 다음과 같은 에러를 마주하게 되었다.
ImportError: cannot import name 'bisect_left' from partially initialized module 'bisect' (most likely due to a circular import) (c:\Users\bisect.py)
이게 뭐지 싶어서 파파고에 돌려보고
그래도 뭔지 몰라서 구글링해보았다.에러 원인은 파일 명이다.
bisect.py 파일에서 bisect 모듈을 import 했기 때문에 문제가 발생한 것이다.위의 파일 명을 그냥 nayoon.py로 바꿔보겠다.
# nayoon.py from bisect import bisect_left, bisect_from nums = [0, 1, 2, 3, 4, 5, 6, 7 , 8, 9] print(bisect_left(nums, 5)) # 5
문제 없이 잘 실행된다.
https://wikidocs.net/29
위의 글을 보면 다음과 같은 문장이 있다.모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다. 우리는 파이썬으로 프로그래밍을 할 때 굉장히 많은 모듈을 사용한다. 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다.
이 글을 쓰게 된 이유인 bisect이라는 모듈은 잘 알려진 파이썬 내장 모듈로 아마 위의 글에서의 모듈 구분으로 보면 다른 사람들이 이미 만들어 놓은 모듈로 볼 수 있다.
만약 파이썬 내장 모듈인 bisect이 먼저 import 되었다면, 위와 같은 에러를 만났을까하는 의문이 들었다.
다른 사람들이 이미 만들어 놓은 모듈과 우리가 직접 만들어서 사용하는 모듈 간의 import 순서 차이에 대해 알아보았다.
import 순서
- sys.modules
우리가 작업 중인 directory를 의미한다.
Python이 Module/Package를 찾기 위해 가장 먼저 확인하는 곳이다.- built-in modules
Python에서 제공하는 공식 라이브러리을 의미한다.
이 곳에 bisect 모듈이 포함되어있다.
또한, os, sys, time 등과 같은 Python Standard Library가 여기에 해당된다.
별도의 설치없이 사용가능하다.- sys.path
마지막으로 sys.path가 있는데, sys.path는 package의 __init__변수와 같이 String Value로 된 list이다.sys.modules -> built-in modules -> sys.path 순서로 찾고 sys.path에서도 없다면, 모듈을 찾을 수 없다는 error를 반환한다.