[Python] 프로젝트 내 패키지 import 방법

2023. 11. 3. 13:17Developers 공간 [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
반응형