[Python] Modules & Packages

이동명·2021년 6월 10일
0

파이썬에서 코드의 재사용성을 높여주는 modules와 packages에 대해 알아보자
또한, 어떻게 module이 import 되는지 알아보자


  • Module: 변수, 함수, 그리고 Class를 모아놓은 파일
  • Package: 여러개의 Module이 들어있는 directory

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이다.


sys.modules

제일 먼저 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 모듈은 파이썬을 설치할 때, 기본적으로 저장되는 모듈이다.

built-in Module의 예로, sys, builtins 등이 있다.

sys 모듈 안에는 sys.modules와 같은 dictionary, sys.path와 같은 list가 내장되어 있다.

또한, builtins 모듈 안에는 sum, divmod와 같은 함수와 tuple, dict와 같은 자료형 등이 내장되어 있다.

위와 같은 모듈들은 속도향상을 위해 C언어로 작성되어 있는데, Python 폴더 안에 각각 sysmodule.c, bltinmodule.c 라는 이름으로 저장되어 있다.


sys.path

마지막으로 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']

0개의 댓글