TIL 4.(replit4.) Import Modules & Packages

jiffydev·2020년 9월 17일
0

1. sys.modules vs sys.path

  • sys.modules는 이미 import된 모듈, 패키지만 저장하고 있는 반면, sys.path는 파이썬에 저장된 모든 모듈, 패키지에 대한 정보를 저장하고 있다.
  • sys.modules는 딕셔너리 형식으로 모듈명:모듈객체로 출력해주지만 sys.path는 리스트 형식으로 모듈의 경로를 출력해준다.

2. sys 모듈의 위치

sys.modules를 사용해 확인하면 sys는 'sys': <module 'sys' (built-in)> 즉, 빌트인 모듈로 이미 내장되어 있어 built-in modules에 저장되어 있다.

3. Absolute path vs Relative path

  • Absolute와 Relative의 차이는 기준이 되는 경로를 어디에 놓느냐이다.
  • 절대경로는 모듈의 최상위 디렉터리를 기준으로 import 한다.
  • 그러므로 import 하고자 하는 모델이 깊은 곳에 있다면 최상위에서 그곳까지의 경로를 적어야 하기 때문에 길이가 길어지게 된다.
  • 상대경로는 import 하는 위치를 기준으로 경로를 찾아간다. 그렇기 때문에 일반적으로 로컬 패키지 안에서 다른 패키지를 찾을 때 사용하게 된다.
  • 상대경로는 경로의 길이는 짧아질 수 있지만 현재 위치를 제대로 파악하고 있어야 하기 때문에 특별한 상황이 아닌 한 절대경로를 쓰는 것이 바람직하다.

4. main 모듈에서의 절대경로와 상대경로

일반적으로 모듈을 import할 때는 상대경로로도 가능하다. 하지만 패키지 내에서 main 모듈은 항상 이름이 "__main__"이고, 상대경로는 현재 모듈의 이름을 기반으로 하고 있기 때문에 main 모듈로 사용하려는 모듈에 한해서는 반드시 절대경로를 사용해야 한다. 그렇지 않으면 ImportError: attempted relative import with no known parent package에러를 발생시킨다. 출처

보충) 모듈의 name은 표준입력, 스크립트, interactive prompt에서 읽어올 때는 '__main__'으로 세팅된다. 그렇기 때문에 main.py에서 상대경로로 import하게 되면 실행중인 main.py의 이름도 main이기 때문에 인터프리터는 어떤 것을 불러와야 하는지 모르게 되므로 에러가 뜬다.

5. main 모듈이 아닌 곳에서의 절대경로와 상대경로

main 모듈에서는 상대경로로 import 할 경우 에러가 발생한다. 하지만 그 외의 모듈에서는 절대경로와 상대경로를 모두 사용할 수 있는데, 아래와 같이 문제 없이 동작한다.

절대경로로 설정했을 때

상대경로로 설정했을 때

6. __init__.py의 역할

패키지를 import할 때, 전술했듯 파이썬은 sys.path 를 탐색하며 패키지의 하위 디렉터리를 찾는다. 이 때 __init__.py는 이 파일을 포함하고 있는 디렉터리를 패키지로 취급할 수 있도록 만든다. init파일은 빈 파일이어도 상관 없으나, 초기화 코드를 실행시킬 수도 있다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글