[python] import 순서

nayoon·2021년 5월 21일
2

computer

목록 보기
11/25

문제 상황

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

문제 없이 잘 실행된다.

import

https://wikidocs.net/29
위의 글을 보면 다음과 같은 문장이 있다.

모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다. 우리는 파이썬으로 프로그래밍을 할 때 굉장히 많은 모듈을 사용한다. 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다.

이 글을 쓰게 된 이유인 bisect이라는 모듈은 잘 알려진 파이썬 내장 모듈로 아마 위의 글에서의 모듈 구분으로 보면 다른 사람들이 이미 만들어 놓은 모듈로 볼 수 있다.

만약 파이썬 내장 모듈인 bisect이 먼저 import 되었다면, 위와 같은 에러를 만났을까하는 의문이 들었다.

다른 사람들이 이미 만들어 놓은 모듈과 우리가 직접 만들어서 사용하는 모듈 간의 import 순서 차이에 대해 알아보았다.

import 순서

  1. sys.modules
    우리가 작업 중인 directory를 의미한다.
    Python이 Module/Package를 찾기 위해 가장 먼저 확인하는 곳이다.
  2. built-in modules
    Python에서 제공하는 공식 라이브러리을 의미한다.
    이 곳에 bisect 모듈이 포함되어있다.
    또한, os, sys, time 등과 같은 Python Standard Library가 여기에 해당된다.
    별도의 설치없이 사용가능하다.
  3. sys.path
    마지막으로 sys.path가 있는데, sys.path는 package의 __init__변수와 같이 String Value로 된 list이다.

sys.modules -> built-in modules -> sys.path 순서로 찾고 sys.path에서도 없다면, 모듈을 찾을 수 없다는 error를 반환한다.

참고 사이트

  1. https://livetodaykono.tistory.com/22
  2. https://wikidocs.net/29
  3. https://m.blog.naver.com/PostView.naver?blogId=jinpw&logNo=221080170215&proxyReferer=https:%2F%2Fwww.google.com%2F
profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글