package의 Absolute path(절대 경로), Relative path(상대 경로) 설정하기

package의 Absolute path(절대 경로), Relative path(상대 경로)

calculator라는 이름의 package directory를 직접 만들며 상대 경로와 절대 경로를 비교하는 실습을 해보겠습니다.

directory 구조는 아래와 같습니다.

sys


각 파일에 담긴 코드 내용입니다.

# in main.py

# relative path
from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))
# in add_and_multiply.py

from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
# in multiplication.py

def multiply(a,b):
    return(a*b)



위와 같이 python을 실행하면 어떻게 될까요?
main.py에서 아래와 같은 Error가 발생합니다.
ImportError: attempted relative import with no known parent package


main.py의 코드를 보시면 relative path로 package를 import한 것을 볼 수 있는데 여기서 에러가 발생된 것입니다.

에러에 대한 자세한 내용을 위해 파이썬 공식 페이지에서 관련 내용을 찾아봤습니다.

Note that relative imports are based on the name of the current module. Since the name of the main module is always “main”, modules intended for use as the main module of a Python application must always use absolute imports.

번역

상대적 가져 오기는 현재 모듈의 이름을 기반으로합니다. 주 모듈의 이름은 항상 “main“이므로 Python 애플리케이션의 주 모듈로 사용하려는 모듈은 항상 절대 가져 오기를 사용해야합니다.


그렇습니다.
main.py는 같은 프로젝트는 맞으나 같은 패키지가 아니기 때문에 항상 절대 경로로 패키지/모듈을 설정해줘야 합니다.



main.py는 절대경로로 package나 modules를 import 해줘야 한다.

main.py의 import를 절대 경로로 수정해보도록 하겠습니다.

# absoulte path
from calculator.add_and_multiply import add_and_multiply 

if __name__ == '__main__':
    print(add_and_multiply(1,2))
출력값
5

정상적으로 값이 출력되었습니다.



같은 package directory 내 패키지간의 import


그럼 같은 directory 내 패키지끼리의 import는 어떨까요?
위에서 add_and_multiply.py에서 multiply 함수를 상대 경로로 import 했을 때 정상적으로 작동이 되었습니다.
그럼 절대 경로도 마찬가지로 정상적으로 작동하는지 확인해보겠습니다.

# in add_and_multiply.py

# from .multiplication import multiply
from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

절대 경로도 마찬가지로 import가 정상적으로 작동됩니다.
즉, 같은 패키지끼리는 절대 경로와 상대 경로 모두 가능한 것을 확인 할 수 있습니다.



init.py 파일의 역할


마지막으로 패키지 폴더에 보면 init.py 이라는 파일이 있는데 왜 있는 걸까요?
심지어 파일안에는 아무 코드도 없습니다. 그 이유는 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 하기 떄문입니다.

업데이트:

댓글남기기