코드를 작성하고 있는데 다른 파일에 있는 코드를 쓰고 싶을 때 어떻게 해야 할까? 🤔
파이썬에서는 모듈과 패키지를 import 해서 사용할 수 있다.
변수나 함수 그리고 클래스 등을 모아 놓은 파일이다. *.py
#my_module.py
x = 10
def my_module_func():
print('hello')
import 모듈이름
<모듈이름>.<모듈에서 사용하길 원하는 변수/함수/클래스 이름>
import my_module
print(my_module.x) #10
my_module.my_module_func() #hello
#as로 모듈이름을 줄여서 사용할 수 있다.
import my_module as m
print(m.x)
m.my_module_func()
from 모듈이름 import 변수/함수/클래스
from my_module import x, my_module_func
print(x) #10
my_module_func() #hello
파이썬 파일들로 이루어져 있는 디렉토리가 하나의 패키지가 된다.
그리고 그 디렉토리 이름이 패키지 이름이다.
#import 디렉토리명.파일명
import package.module1
#from 디렉토리명.파일명 import 변수/함수/클래스명
from package.module2 import func2
package.module1.func1()
func2()
패키지 내 __init__
의 역할
__init__.py
파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
파이썬 3.3 버전부터는 없어도 패키지로 인식한다. 하지만 하위 버전 호환을 위해 파일을 생성하는게 안전한 방법이다.
package가 import 될 때 __init__.py
의 코드들이 자동으로 실행된다.
① import 할 때 경로의 총 길이 줄여주기
패키지 디렉토리 내에 module1.py를 import 할 때 위의 예시처럼 하면 코드가 너무 길어지기 때문에 __init__.py
를 이용한다.
#__init__.py
from .module1 import func1
#main.py
from package import func1
func1()
② 패키지에서 import 할 수 있는 변수/함수/클래스 제한하기
*
를 이용하여 import 할 경우 __init__.py
파일 내 __all__
변수에 저장된 모듈만 사용가능하다.
#__init__.py
from .module1 import *
__all__ = ['func1', 'x']
#main.py
from package import *
func1()
print(x)
print(y) #error, y는 module1 파일에 존재하는 변수
③ 그 외 패키지가 import 될 때 꼭 먼저 실행되어야 하는 코드들
sys.modules → built-in modules → sys.path
sys.path 에서도 못 찾으면ModuleNotFoundError
를 리턴한다.
sys
는 파이썬에 포함되어 있는 모듈이다.(built-in modules)
따라서 sys
를 import 해서 sys.modules와 sys.path 를 출력할 수 있다.
import sys
print(sys.modules)
print(sys.path)
#절대경로
#main.py에서 module1 import
from package.module1 import x
print(x)
#상대경로
#module1.py 에서 module2 import
from .module2 import module2_x
y = module2_x + 100
#main.py 에서 module1 import
from package.module1 import y
print(y)
💡 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.
❗️해당 모듈이 직접 실행되는 경우에는 __name__
은 __main__
으로 설정된다. ❗️
위 상대경로 마지막 예제에서 main.py의 __name__
은 __main__
, module1의 __name__
은 package.module1
이다.
👉 따라서 main 파일에서는 절대경로를 써야 하고 module1 파일에서는 상대경로를 써도 무방하다.
💡
__name__
현재 모듈의 이름을 담고 있는 내장변수로,
print(__name__)
으로 값을 알 수 있다.
참고자료: https://docs.python.org/3/tutorial/modules.html#intra-package-references