[Python] 프로젝트 내 패키지 import 방법
2023. 11. 3. 13:17ㆍDevelopers 공간 [Shorts]/Software Basic
728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
프로젝트 구조가 아래와 같을 때 import 할때의 주의점에 대해서 정리해보고자 합니다.
- Project Folder Tree
├── file0.py
└── DEPTH1_1
├── __init__.py
└── file1_1.py
└── DEPTH2_1
├── __init__.py
└── file2_1.py
└── DEPTH2_2
├── __init__.py
└── file2_2.py
└── DEPTH1_2
├── __init__.py
└── file1_2.py
2. Why? (원인)
- X
3. How? (해결책)
먼저 절대경로 import와 상대경로 import의 차이에 대해서 살펴보고자 합니다.
1. 절대경로(Absolute Path) import
절대경로는 해당 페이지(https://tkayyoo.tistory.com/24)에서 설명했다시피 실행한 __main__이 속한 .py 파일이 속한 절대 경로가 기본적으 sys.path에 포함될 것이기 때문에 해당 파일을 기준으로 import를 할 수 있습니다.
from DEPTH1_1 import file1_1
2. 상대경로(Relative Path) import
상대경로는 작업하고 싶은 파일의 위치를 기준으로 import를 하는 방법입니다. 하지만 아래와 같은 주의점이 있습니다.
from .DEPTH1_1 import file1_1
- 주의점1.실행할 __main__ module이 속한 파일에서는 해당 모듈의 이름이 바뀌기 때문에 절대경로 import를 사용해야 합니다.
- 주의점2. imported module이 속한 파일에서는 "해당 파일을 기준으로 한" 상대경로나, "__main__ module"을 기준으로 절대경로를 적어주어야합니다.
- 예를들어, 위 파일에서 file0에서 file1_1을 import하고, file1_1에서 file2_1을 import하는 경우 아래 예시를 참조하면 좋습니다.
#file0
from DEPTH1_1 import file1_1
#file1_1.py
from .DEPTH2_1 import file2_1 #OK
from DEPTH2_1 import file2_1 # NO
from .DEPTH1_1.DEPTH2_1 import file2_1 # NO
from DEPTH1_1.DEPTH2_1 import file2_1 # OK
- 주의점3. __init__.py를 구성하는 방법은 아래와 같습니다. 보통 해당 디렉토리가 패키지임을 명시하기 위해 사용합니다.
# DEPTH1_1/__init__.py
from . import file1_1
# file0.py
import DEPTH1_1
DEPTH1_1.file1_1.function()
다음으로 부모 경로를 import하는 방법을 정리해 보겠습니다.
1. Parent : file2_1.py에서 file2_2.py를 import 하고싶을 때
# file2_1.py
from ..DEPTH2_2 import file2_2
2. Parent of Parent : file2_1.py에서 file1_2.py를 import 하고싶을 때
# file2_1.py
from ...DEPTH1_2 import file1_2
혹은 위와 같이 부모의 경로를 프로젝트 밖에서 import하는 경우 아래와 같은 에러가 날 수도 있습니다.
ImportError : attempted relative import with no known parent package
따라서 추가적으로 절대적인 경로를 제공하고 싶은 경우 직접 sys.path에 경로를 추가해줍니다.
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
마지막으로 예외 케이스를 두는 방법은 아래와 같습니다.
try:
from DEPTH1_1 import *
except ImportError :
from DEPTH1_2 import *
728x90
반응형
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[PyTorch] 특정 GPU로 정해 동작시키기 (1) | 2023.11.08 |
---|---|
[Bash] 파일명을 활용해 작업하는 기초 명령어 (1) | 2023.11.03 |
[Bash] Background로 프로그램 돌리기 (0) | 2023.11.01 |
[Bash] 서버에서 자료 가져오기 (port, 방화벽) (0) | 2023.10.27 |
[Bash] ssh 비밀번호 없이 접근하기 (0) | 2023.10.27 |