파이썬에서 코드의 재사용성을 높여주는 modules와 packages에 대해 알아보자
또한, 어떻게 module이 import 되는지 알아보자
Module/Package를 import하기 위해서는 해당 Module/Package의 디렉토리를 파이썬이 알아야 한다.
이때, 파이썬은 아래와 같이 3가지 장소를 순서대로 보며 Module/Package를 찾는다.
참고자료: https://docs.python.org/3/reference/import.html#the-meta-path
1. sys.modules
2. built-in
3. sys.path
여기서 sys
또한 Module인데, 파이썬의 built-in module이다.
제일 먼저 Module을 찾는 장소인 sys.modules
는 파이썬이 실행되고 나서, import된 모든 Modules을 포함하는 dictionary이다. key는 Module의 이름이고, value는 Module 객체가 저장되어있다.
sys.modules
을 출력해보면, sys, builtins
등의 모듈이 dict 형태로 저장되어 있는 것을 확인할 수 있다.
>>> import sys
>>> print(sys.modules.keys())
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_warnings', '_frozen_importlib_external', '_io', 'marshal', 'posix', '_thread', '_weakref', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', '_abc', 'abc', 'io', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', '_locale', '_bootlocale', 'types', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib', 'importlib.machinery', 'importlib.abc', '_operator', 'operator', 'keyword', '_heapq', 'heapq', 'itertools', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'contextlib', 'importlib.util', 'mpl_toolkits', 'sphinxcontrib', 'zope', 'site', 'readline', 'atexit', 'rlcompleter'])
>>> print(sys.modules['sys'])
<module 'sys' (built-in)>
>>> print(sys.modules['builtins'])
<module 'builtins' (built-in)>
built-in 모듈은 파이썬을 설치할 때, 기본적으로 저장되는 모듈이다.
built-in Module의 예로, sys, builtins
등이 있다.
sys
모듈 안에는 sys.modules
와 같은 dictionary, sys.path
와 같은 list가 내장되어 있다.
또한, builtins
모듈 안에는 sum, divmod
와 같은 함수와 tuple, dict
와 같은 자료형 등이 내장되어 있다.
위와 같은 모듈들은 속도향상을 위해 C언어로 작성되어 있는데, Python 폴더 안에 각각 sysmodule.c, bltinmodule.c
라는 이름으로 저장되어 있다.
마지막으로 Module을 찾는 장소인 sys.path
는 모듈의 위치를 찾을 경로 string을 포함하는 list이다.
sys.path에는 실행되는 script가 위치한 directory가 첫번째로 추가되고, 추가로 PYTHONPATH
및 installation-dependent default인 site-packages
경로가 추가된다.
(참고자료): https://docs.python.org/3/tutorial/modules.html#the-module-search-path
'/Users/dongmyeong/projects/wecode/precourse/module-test'
폴더에 위치한 main.py를 실행한 결과
# main.py
>>> import sys
>>> print(sys.path)
['/Users/dongmyeong/projects/wecode/precourse/module-test', '/Users/dongmyeong/projects/wecode/precourse/module-test', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/dongmyeong/Library/Python/3.8/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend']