Python

[Python] 다른 경로에 있는 폴더/파일 import 하기(__init__, __all__)

ssun-g 2022. 2. 11. 18:58
파이썬 개발 시 패키지 관리를 위해 모듈들을 기능별로 묶고, 폴더로 나누는 경우가 종종 있다.
이 때, 다른 경로에 있는 모듈들을 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 추가

# __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)

NameError: name is not defined

 

다음과 같이 모든 모듈을 사용 가능하도록 변경하면 오류가 발생하지 않는다!

__all__ = ["add", "sub", "mul", "div"]

하지만 터미널에서 실행할 경우 상위 폴더의 패키지는 위 방법으로 import 할 수 없다!

 

main.py 이동

 

main.py 를 sub폴더로 이동시킨 뒤, 터미널에서 main.py를 실행하면 다음과 같이 모듈을 찾을 수 없다는 오류가 발생한다.

ModuleNotFoundError: No module named

 

이 경우 간단하게 -m 옵션을 사용하여 실행하면 문제가 해결된다.

 

-m 옵션을 사용하여 module로 실행하게 될 때는 다음과 같이 명령어를 작성한다. (확장자는 제외한 이름만 적는다.)

python -m [폴더명].[파일명]

ex) python -m sub.main