[python] import 상대경로 한번에 해결하기
Ex. 내가 어제 겪은 상황:
-> detection
-> A
-> a.py
-> B
-> b.py
->bb.py
-> C
-> c.py
-> detect.py
-> test.py
가장 상위 폴더에 detection이라는 폴더와 test.py가 있고,
detection 폴더 안에 폴더 A, B, C가 있음.
test.py와 detect.py는 거의 같은 내용으로 같은 모듈들을 import 해야함
test.py에서 A폴더 내의 a.py, B 폴더내의 bb.py를 import할때는
아래와 같이 하면 되고 (test.py를 실행하는 경로는 가장 상위 경로니까 )
from Detection.A.a import {a.py 내에 있는 함수 이름}
from Detection.B.bb import {bb.py 내에 있는 함수 이름}
같은 함수를 detect.py 내에서 import 할때에는 아래와 같이 하면 된다.
(detect.py를 실행하는 경로는 ROOT/detection이니까)
from A.a import {a.py 내에 있는 함수 이름}
from B.bb import {bb.py 내에 있는 함수 이름}
문제는, detect.py와 test.py가 둘다 A.a를 import 하는데
다시 A.a가 C.c를 import 하는 상황이다. (실제로는 폴더가 한 5개정도 됐음,,,,,🤣)
이게 왜 문제냐면,
A.a를 test.py도 import 하고, detect.py도 A.a import 해야하는데,
test.py -> A.a.py -> C.c.py 일때는 실행하는 경로가 ROOT이고
detect.py -> A.a.py ->C.c.py 일때는 실행하는 경로가 ROOT/Detection 이었다.
(물론 ROOT에서 python Detection/detect.py로 실행하면 문제가 없지만, 내 경우에는 Detection 내에서 실행을 해야했다)
그럼 A.a.py는 from C.c import {C.c에 있는 함수}로 import 하면 test.py 실행시 문제가 생기고
from Detection.C.c import (C.c에 있는 함수)로 import 하면 detect.py 실행시에 문제가 생긴다 😥
이를 해결하기 위한 방법은 크게
1. CLI 커맨드로 bash 자체에 영구적으로 export PYTHONPATH 하는 방법 (영구해결)
2. python 파일 최상단에서 sys.path에 ROOT/Detection 폴더를 추가해주는 방법
(해당 프로세스나 창이 꺼지면 리셋되는 듯?)
근데 1번은.. 내가 잘 이해를 못한건지,,,종종 잘 안되는 경우가 많아서ㅜ
이렇게 아래처럼 전체 파일에 python path로 root path를 붙여주면 제일 잘되는거 같다
이렇게 하면 파일이 실행되는 ROOT 경로를 system path에 추가해주기 때문에
import error를 일으키는 파일 위에 추가를 해주거나 가장 상위 파일에 추가를 해주면 대부분 문제가 없다.
import os
import sys
from pathlib import Path
FILE = Path(__file__).resolve()
ROOT = FILE.parents[0] # root directory
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT)) # add ROOT to PATH
아래는 좀더 심플한 버젼! 근데 위 코드가 더 general하게 error 안날꺼 같다.
import os, sys
if not os.getcwd().endswith("Detection"):
sys.path.append(os.getcwd() + "/Detection")