import abc
abc라는 모듈 or 패키지를 파이썬에서는 어떻게 가져 오는 걸까??
이 세가지 장소를 순서대로 보면서 찾아 보겠다.
['', '/Users/song-eun-u/anaconda3/bin', '/Users/song-eun-u/anaconda3/lib/python36.zip', '/Users/song-eun-u/anaconda3/lib/python3.6', '/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload', '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages', '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/song-eun-u/.ipython']
sys.path를 뜯어보면 이렇게 경로가 표시 되어있는데 import하고자 하는 패키지가 여기 있는지 확인한다.
위의 3가지 방법으로도 찾지 못한다면
ModuleNotFoundError 에러를 리턴하게 된다.
모듈과 패키지는 위의 세가지의 경우에서는 문제없이 잘 찾아진다.
하지만 직접 개발한 local package는 import할 때 해당 패키지의 위치에 맞게 import경로를 잘 선언 해야 한다.
로컬 패키지를 import 하는 경로에는 두가지 방법이 있다.
1. absolute path
2. relative path
아래 my_app이라는 프로젝트를 예로 들어보겠다.
여기서 main.py에 패키지를 import 해오는 것은 아래의 이미지와 같이 import 할 수 있다.
예를 들어 package2안에 subpackage1안에 module5 안에 function2라는 함수를 사용 하고 싶다 할때는
from package2.subpackage1.module5 import function2
위와 같이 import해 올 수 있다.
예를 들어, package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import 하려고 하면 다음 처럼 할 수 있습니다.
# package2/module3.py from . import class1 from .subpackage1.module5 import function2
여기서 .
은 import가 선언되는 파일의 현재 위치를 이야기 한다.
현재 위치는 package2/module3.py이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 되는 것이다.
..
은 현재위치에서 상위 디렉토리로 가는 경로이다.
# subpackage1/module5.py from ..module4 import class4
1. sys.modules 와 sys.path의 차이점을 서술해 주세요.
2. sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?
3. Absolute path와 relative path의 차이점을 서술해 주세요.
4. calculator 패키지 만들기
__init__.py
파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.
main.py
# absoulte path # from calculator.add_and_multiply import add_and_multiply # relative path from .calculator.add_and_multiply import add_and_multiply if __name__ == '__main__': print(add_and_multiply(1,2))
add_and_multiply.py
from .multiply import multiply #from calculator.multiply import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b)
multiplication.py
def multiply(a,b): return(a*b)
5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.
https://docs.python.org/3/tutorial/modules.html#intra-package-references
이 오류는 main.py 파일이 최상위 파일이라는 것을 알려준다.
상대경로를 주석처리하고 절대경로로 import하면 다음과 같이 결과가 잘 출력된다.
6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.
절대경로로 실행을 했을 때는 문제없이 컴파일이 되지만
상대경로로 실행을 했을 때는 다른 모듈로 Import를 해온 후__main__
으로 실행을 시키기 때문에 파이썬에서 해당파일의 위치를 정확히 알기가 쉽지 않다.
하지만 add_and_multiply를 직접 컴파일 하지 않고 다른 곳에서 import로 add_and_multiply를 불러오면 정상적으로 실행이 가능하다.
7.__init__.py
파일의 역할에 대해서도 정리해서 블로깅 해주세요.
__init__.py
를 사용한다. __init__.py
가 있으면 패키지가 임포트 될 때 __init__.py
파일의 코드들이 자동으로 실행 된다.