

상대경로와 절대경로에서 어떤 경우에 import에러가 나타나는지 살펴보자.
상대경로: 내가 작업하는 위치를 기준으로 경로가 결정
절대경로: 최상단 디렉토리를 기준으로 하는 경로이다. 어느 파일, 어느 위치에서든 경로가 항상 동일하다.
import os
os.getcwd() #os 모듈의 getcwd()는 현재 디렉토리(작업폴더)를 알려줍니다.
#C:\Users\Jaesang Choi\Desktop\CALC
calc/main.py
from .calculator.add_and_multiply import add_and_multiply if __name__ == '__main__': print(add_and_multiply(1,2))
calc/calculator/add_and_multiply.py
from .multiplication import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b)
calc/calculator/multiplication.py
def multiply(a,b): return(a*b)
calc/main.py
from .calculator.add_and_multiply import add_and_multiply if __name__ == '__main__': print(add_and_multiply(1,2))
main.py에서 상대경로로 add_and_multiply 함수를 import할 때 에러가 발생한다.
에러 로그는 다음과 같다.
'attempted relative import with no known parent package`'
다음과 같은 에러가 나오는 이유:
상대경로로 import를 할 땐 현재 module의 이름을 기반으로 한다.
그런데 현재 활성화된 메인 모듈의 이름은 항상 __main__이기 때문에 파이썬이 상대경로의 출발점,
즉 메인모듈의 위치를 찾지 못하기 때문이다.
(만약에 apple.py모듈이 메인모듈이라면 그것도 역시 이름이 __main__으로 변경된다.)
if __name__ == '__main__':
print(add_and_multiply(1,2)) 에서
__name__ == "__main__"인걸 보면 알 수 있다.
그렇기 때문에 절대경로를 써야 이를 해결할 수 있다.
from calculator.add_and_multiply import add_and_multiply #절대경로로 변경 if __name__ == '__main__': print(add_and_multiply(1,2))
현재 폴더의 경로는 C:\Users\Jaesang Choi\Desktop\CALC 이니까 그 다음에 올 경로만 쓰면 된다.
add_and_multiply.py는 상대경로로 쓰일 수 있다.
이유는 메인파일이 실행되고 나면 메인을 기준으로 절대경로가 잡히게 되는데,
이때 add_and_multiply는 경로내에서 calculator 패키지의 하위 모듈로 등록이 된다.
메인모듈의 절대경로가 잡히면서 다른 모듈들을 상대적으로(Relative) 비교할수 있는 뿌리가 생긴 것이다.
중요!) 따라서 메인파일에선 절대경로를, 그외의 하위모듈은 상대경로를 사용할 수 있게 된다.
add_and_multiply.py(상대경로)
from .multiplication import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b)
add_and_multiply.py(절대경로) #절대경로로도 사용 할 수 있다.
from calculator.multiplication import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b)
절대경로 가능
from multiplication import multiply def add_and_multiply(a,b): return multiply(a,b) + (a+b)
단 위와같은 절대경로로는 사용할 수 없다.
main.py 실행
add_and_multiply를 main모듈에 import할 때 절대경로를 써야한다.
(상대경로 쓸 시 에러.)
add_and_multiply에서 multiplication를 import할때 상대경로,절대경로 둘 다 가능하다.
add_and_multiply 직접실행 (이제 이 모듈이 메인모듈이 됨)
multiplication를 import할때 절대를 써주어야한다.
(상대경로 쓸 시 에러.)
TIL#36 하위,동일,상위파일 import하기
TIL#28 import error 상대경로 절대경로 상대경로와 절대경로에서 어떤 경우에 import에러가 나타나는지 살펴보자. import os print(os.path.abspath('.')) #현재 폴더의 절대경로를 물어보는 것 C:\Users\Jaesa..
higher77.tistory.com
참고자료:
'Python > Today I learned' 카테고리의 다른 글
TIL#30 내장함수 (0) | 2021.05.19 |
---|---|
TIL#29 예외(exception) (0) | 2021.05.19 |
TIL#27 패키지와 import (0) | 2021.05.18 |
TIL#26 모듈과 import, sys.path (0) | 2021.05.18 |
TIL#25 클래스 와 인스턴스(중요) (0) | 2021.05.18 |