파이썬 개발 시 패키지 관리를 위해 모듈들을 기능별로 묶고, 폴더로 나누는 경우가 종종 있다.
이 때, 다른 경로에 있는 모듈들을 import 하는 방법을 알아보자.
프로젝트 구성은 다음과 같다.
# add_number.py
def add(a, b):
return a + b
우리가 사용할 main.py에서 위의 add 함수를 사용하고 싶다면 from [파일 경로] import [함수명] 으로 패키지를 import 한다.
# main.py
from package_test.add_number import add
a = add(1, 2)
print(a) # 3 출력
또는 from [폴더 경로] import [파일명] 으로 패키지를 import 할 수 있다.
# main.py
from package_test import add_number
a = add_number.add(1, 2)
print(a) # 3 출력
이제 모듈을 여러개 추가 해보자. 각 함수는 다음과 같은 동작을 한다.
- add_number: 덧셈
- div_number: 나눗셈
- mul_number: 곱셈
- sub_number: 뺄셈
위와 같이 패키지 내에 여러 개의 모듈이 존재 한다면 아래와 같이 하면 될까?
from package_test import add_number
from package_test import sub_number
from package_test import mul_number
from package_test import div_number
...
틀린 방법은 아니지만 __init__.py를 이용해 같은 패키지의 모듈을 한 번에 불러올 수 있다.
# __init__.py
from .add_number import add
from .sub_number import sub
from .mul_number import mul
from .div_number import div
__init__.py에 패키지를 담아 놓고 main.py에서 폴더를 import 하면 사용할 수 있다.
# main.py
import package_test as pack
add = pack.add(1, 2) # 3
sub = pack.sub(6, 2) # 4
mul = pack.mul(2, 3) # 6
div = pack.div(10, 2) # 5.0
print(add) # 3
print(sub) # 4
print(mul) # 6
print(div) # 5.0
__all__ 을 이용해 사용 가능한 모듈을 설정해 줄 수 있다.
다음과 같이 add 함수만 사용하도록 지정하면
from .add_number import add
from .sub_number import sub
from .mul_number import mul
from .div_number import div
__all__ = ["add"]
위에서 사용한 코드와 동일한 코드를 실행했을 때 모듈이 정의되지 않았다는 오류가 발생한다.
from package_test import *
add = add(1, 2) # 3
sub = sub(6, 2)
mul = mul(2, 3)
div = div(10, 2)
print(add) # 3
print(sub) # 오류 발생!
print(mul)
print(div)
다음과 같이 모든 모듈을 사용 가능하도록 변경하면 오류가 발생하지 않는다!
__all__ = ["add", "sub", "mul", "div"]
하지만 터미널에서 실행할 경우 상위 폴더의 패키지는 위 방법으로 import 할 수 없다!
main.py 를 sub폴더로 이동시킨 뒤, 터미널에서 main.py를 실행하면 다음과 같이 모듈을 찾을 수 없다는 오류가 발생한다.
이 경우 간단하게 -m 옵션을 사용하여 실행하면 문제가 해결된다.
-m 옵션을 사용하여 module로 실행하게 될 때는 다음과 같이 명령어를 작성한다. (확장자는 제외한 이름만 적는다.)
python -m [폴더명].[파일명]
ex) python -m sub.main
'Python' 카테고리의 다른 글
[Python] type()과 isinstance()의 차이 (0) | 2023.08.23 |
---|---|
[Python] requirements.txt에 링크 넣기 (0) | 2023.06.07 |
[Python] Private PyPI Server 구성하기 (0) | 2022.04.28 |
[Python] PyPI 패키지 만들기 및 배포 (0) | 2022.04.27 |
[Python] postgreSQL 연동하기 (0) | 2022.01.23 |