다음은 main script 등에서 relative path import를 사용할 때,__name__
을 기준으로 삼기 때문에 주의해야 점을 발생 가능한 문제를 예를 들어서 설명하는 문서임.
예제 디렉토리 구조
my_package/
__init__.py
main.py
subpackage/
__init__.py
module_a.py
module_b.py
코드 예제
1. module_a.py:
# my_package/subpackage/module_a.py
def greet():
return "Hello from module_a"
2. module_b.py:
# my_package/subpackage/module_b.py
from .module_a import greet
def greet_from_b():
return greet()
3. main.py:
# my_package/main.py
from subpackage.module_b import greet_from_b
if __name__ == "__main__":
print(greet_from_b())
상황 설명
module_a.py
는 간단한 함수를 가지고 있음.module_b.py
는 상대 경로로module_a
를 임포트하고 있음.main.py
는module_b
를 임포트하고 함수를 호출함.
참고: __file__
과 __name__
의 차이
__file__
은 모듈 파일의 경로를 나타냄.- 예를 들어,
my_package/subpackage/module_a.py
의__file__
값은 이 파일의 경로가 됨.
- 예를 들어,
__name__
은 모듈의 이름을 나타냄.- 이는 모듈이 어떻게 임포트되었느냐에 따라 달라짐.
main.py
를 직접 실행하는 경우
my_package
디렉토리에서 python main.py
명령어를 실행하면:
main.py
의__name__
은"__main__"
이 됨.main.py
에서from subpackage.module_b import greet_from_b
구문이 실행될 때,module_b
의__name__
은"subpackage.module_b"
가 됨.module_b.py
내부에서from .module_a import greet
구문이 실행될 때,.
은"subpackage"
을 의미함. 따라서module_a
가 제대로 임포트됨.
잘못된 실행 방법
module_b.py
를 직접 실행하려고 하는 경우:
python my_package/subpackage/module_b.py
이 경우:
module_b.py
의__name__
은"__main__"
이 됨.- 상대 경로 임포트
from .module_a import greet
가 실패함. - 이는
.
이 더 이상subpackage
를 가리키지 않기 때문임.__main__
은 패키지 컨텍스트를 잃게 됨.
올바른 실행 방법
패키지 내의 모듈을 실행하려는 경우:
python -m my_package.subpackage.module_b
이 경우:
module_b.py
의__name__
은"my_package.subpackage.module_b"
가 됨.- 상대 경로 임포트
from .module_a import greet
가 정상적으로 작동함.
요약
__name__
은 모듈의 이름을 나타내며, 이는 모듈이 어떻게 실행되었는지에 따라 달라짐.- 상대 경로 임포트는
__name__
을 기준으로 동작하므로, 직접 실행할 때는 패키지 컨텍스트가 유지되지 않아 문제가 발생함. python -m package_name.module_name
으로 실행하면 모듈이 패키지의 일부로 인식되어 상대 경로 임포트가 정상적으로 작동함.
이렇게 __file__
이 아닌 __name__
을 기준으로 동작하는 이유는 파이썬의 임포트 시스템이 모듈의 위치와 관계없이 모듈의 이름을 기준으로 동작하도록 설계되었기 때문임.
같이 보면 좋은 자료들
https://dsaint31.tistory.com/528
'Python' 카테고리의 다른 글
[Python] 사용자와 상호작용: 입력받기: input, argv, and sys (0) | 2024.07.24 |
---|---|
[Programming] Binding: Name Binding and Language Binding (0) | 2024.06.06 |
[Python] PIL, Pillow, OpenCV, and Scikit-image (0) | 2024.06.03 |
[ML] Classification 과 관련 metrics 에 대한 소개. (0) | 2024.06.01 |
[DL] Dataset: CIFAR-10 (0) | 2024.05.30 |