상대경로와 절대경로에서 어떤 경우에 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

 

 

 

참고자료:

https://velog.io/@hamsterhamin/Python-ImportError-attempted-relative-import-with-no-known-parent-package

https://livetodaykono.tistory.com/23

'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

+ Recent posts