모듈은 미리 작성된 스크립트 라고 할 수 있습니다. 파이썬에서 작성한 함수나 클래스 등은 파이썬을 종료하면 사라지게 됩니다. 작성한 함수나 클래스 등을 계속 사용하고 싶다면 스크립트를 작성해놓고 불러오는 방식(import) 으로 사용할 수 있습니다. 이렇게 작성된 스크립트를 모듈 (module)이라고 부릅니다.
이러한 파이썬 모듈은 .py 확장자를 원칙으로 합니다.
모듈 만들기
#my.py
address_mincheol = "GwangjinGU"
def my_func():
return "hi"
모듈 불러오기
import
모듈이름으로 불러오기
import my모듈에서 사용할 변수/함수/클래스 등만 가져오기
import my.address_mincheol(import 사용 예시)
# main.py
import my
print(my.address_mincheol)
my.my_func()
모듈이름을 앞에 붙혀주지 않으면 파이썬은 해당 함수를 찾을 수 없습니다. 그렇기 때문에 해당 모듈이름을 붙혀줍니다.
from import
모듈이름과 사용할 변수/함수/클래스 가져오기
from<모듈이름> import <함수/변수/클래스>,..<함수/변수/클래스N>
(from import 사용 예시)
from my import my_func, address_mincheol
print(address_mincheol)
my_module_func()
모듈에서 사용하는 것이 명확할때 from import 를 사용하면 편리합니다.
별표( * )를 사용하면 해당 모듈의 모든 요소가 import 됩니다.
from my import *
print(my_module_var)
my_module_func()
여러 모듈을 가져오다가 동일한 이름을 만나면 어떻게 해결해야될까요?
as 를 사용해 이름을 직접 바꿔주면 됩니다.
from my import my_func as f1
from my_2 import my_func as f2
f1()
f2()
module 이름도 as 를 사용하여 새로운 이름을 줄 수 있습니다.
import my_module as m1
m1.my_func()
패키지는 여러 모듈을 모아둔 컬렉션을 말합니다. 하나의 모듈에 코드가 많아지게 되면 비효율적인데 이를 해결하기위해 패키지로 여러 모듈을 관리하면 유용합니다.

패키지 불러오기
모듈을 불러오는 방식과 비슷합니다.
import package_name.my
from package_name.my import address_mincheol
다른사람들이 만든 package 도 사용할 수 있습니다.
사용할 패키지를 먼저 설치하고 사용할 수 있습니다.
(장고 패키지 설치하기)
pip install Django
파이썬이 모듈이나 패키지를 찾을때 가장 먼저 확인하는 곳입니다.
sys.modules 는 딕셔너리 타입으로 입니다. 이곳은 이미 import 된 모듈과 패키지들을 저장하고 있습니다. 즉 새로 import 하는 모듈은 sys.modules 에서 못 찾습니다.
print(sys.modules)
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'posix': <module 'posix' (built-in)>, '_thread': <module '_thread' (built-in)>, '_weakref': <module '_weakref' (built-in)>, 'time': <module 'time' (built-in)>, 'zipimport': <module 'zipimport' (frozen)>, '_codecs': <module '_codecs' (built-in)>, 'codecs': <module 'codecs' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/codecs.py'>, 'encodings.aliases': <module 'encodings.aliases' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/encodings/aliases.py'>, 'encodings': <module 'encodings' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/encodings/__init__.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/encodings/utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from '/Users/K/Desktop/Programming/Tutorials/day04/11_21.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/encodings/latin_1.py'>, '_abc': <module '_abc' (built-in)>, 'abc': <module 'abc' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/abc.py'>, 'io': <module 'io' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/io.py'>, '_stat': <module '_stat' (built-in)>, 'stat': <module 'stat' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/stat.py'>, '_collections_abc': <module '_collections_abc' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/_collections_abc.py'>, 'genericpath': <module 'genericpath' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/genericpath.py'>, 'posixpath': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/posixpath.py'>, 'os.path': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/posixpath.py'>, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/os.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/_sitebuiltins.py'>, '_locale': <module '_locale' (built-in)>, '_bootlocale': <module '_bootlocale' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/_bootlocale.py'>, 'site': <module 'site' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site.py'>}
그 다음 파이썬은 built-in modules 들을 찾습니다.
Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있습니다.
print(sys.builtin_module_names)
(...'sys', 'time', 'xxsubtype')
sys 모듈은 빌트인 모듈이므로 이 과정에서 찾을 수 있습니다.
마지막으로 확인하는 곳이 sys.path 입니다.
print(sys.path)
['/Users/K/Desktop/Programming/Tutorials/day04', '/Users/K/Desktop/Programming/Tutorials/day04', '/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/K/Desktop/Programming/Tutorials/day04/venv/lib/python3.8/site-packages', '/Users/K/Desktop/Programming/Tutorials/day04/venv/lib/python3.8/site-packages/setuptools-40.8.0-py3.8.egg', '/Users/K/Desktop/Programming/Tutorials/day04/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg']
이곳은 경로를 나타내는 string 요소들로 이루어진 list 입니다.
집 주소를 이용하는 것과 비슷합니다.
'서울시 광진구 xx동 xxx길xx '
파이썬에서 사용하는 방식
from package1 import module1
네비게이션을 사용하는 것과 비슷합니다.
'50미터 앞에서 좌회전하면 나오는 xx오피스텔'
파이썬에서 사용하는 방식
from .subpackage1.module5 import function2
__
ImportError: attempted relative import with no known parent package
메인 모듈에서 상대경로를 이용해 import 할시 볼 수 있는 에러다.
상대경로로 import 는 현재 모듈의 이름을 기반으로 한다. 파이썬에서 메인모듈의 이름은 항상 "main" 이기에 절대경로로 import 해주면 됩니다.
Note that relative imports are based on the name of the current module. 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.
init.py 는 자기가 위치한 디렉토리가 패키지임을 확인해주는 역할을 합니다.
출처 : https://docs.python.org/3/tutorial/modules.html#intra-package-references