
sys.modules 와 sys.path의 차이점을 서술해 주세요.module이나 package를 찾기위해 가장 먼저 확인하는 곳입니다.sys.modules는 단순한 dictionary 입니다. import된 module과 package들을 저장하고 있습니다.module찾고, 그다음 package를 찾고 마지막으로 sys.path를 찾음sys.path는 기본적으로 list이며 str 요소들을 가지고 있당sys.path에서도 module을 발견하지 못하면 ModuleNotFoundError 에러를 리턴>>> sys.path
['/Users/shinisgood/Documents',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages']
sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다. sys 모듈은 built-in module 이며 인터프리터에 내장되어 있다.sys.modules 나 sys.path 에서 위치를 찾을 수 있다.웬만하면 absolute path를 사용해라
동작을 시켰더니 아래처럼 에러가 뜬다 !
# main.py
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
========================== RESTART:/Users/shinisgood/Documents/main.py ==========================
Traceback (most recent call last):
File "/Users/shinisgood/Documents/main.py", line 6, in <module>
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
>>>
>>> 5
absolute path(imports)사용하라함# main.py
# absoulte path
from calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
상대경로(relative path)으로 돌리면 attempted relative import with no known parent package라는 에러가 뜬다.
Since the name of the main module is always __main__,modules intended for use as the main module of a Python application must always use absolute imports."
즉, main 모듈을 기본 모듈로 사용하기 위해서는 상대경로를 사용해서는 프로그램을 돌릴 수 없다.
__init__.py__init__.py파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.Package 안에 __init__.py 파일이 있으면 package가 import 될때, __init__.py 파일의 코드들이 자동으로 실행됩니다.Import 할때 경로의 총 길이 줄여주기
__init__.py 파일에 먼저 사용할 모듈들을 import 해주면 경로에 따로 모듈 쓸필요가 없지 ?
# __init__.py
from .mod1 import func2
# main.py
from pkg import func2
func2()
Package에서 import 할 수 있는 변수/함수/클래스를 제한할 수 있다.
먼저 import를 한 후 import된 변수/함수/클래스중 쓰고싶은 것만 __all__이라는 이름의 리스트를 만들어서 따로 저장한다
form 패키지이름 import *를 통해 불러올 수 있습니다.# __init__.py
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
# main.py
from pkg import *
func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.