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 될 수 없음.