Python

[Python] import - 다른 경로에 위치한 모듈 가져오기

비번변경 2022. 8. 6. 19:56

import

2022.05.28 - [import] 모듈 가져오기

2022.08.04 - [Python] import - 검색 순서

위 글에서는 모듈을 가져오는 방법과 검색 순서에 대해서 알아보았다. 그래서 다른 경로에 있는 python 모듈을 가져와 사용하려면 어떻게 해야 하는가?

 

파이썬에서는 경로를 나타내는 방법으로 상대 경로와 절대 경로가 존재하지만, 이 글에서는 단순하게 동일 경로에 있는 모듈 하위 경로에 있는 모듈, 상위 경로에 있는 모듈을 가져와보도록 한다.

 

아래는 바쁜 현대인을 위한 요약이다.

동일 경로 : 단순 import
하위 경로 : from <PATH> import <FILE>
상위 경로/다른 경로 : sys.path.append('PATH')

 

 

동일 경로

먼저 아래 구조의 프로젝트가 있다고 하자.

기본 구조

expr/plus.py의 내용은 아래와 같다.

# expr/plus.py

def add(a, b):
    return a + b
    
if __name__ == "__main__":
   add(1, 2)

이 expr/plus.py의 add 함수를 expr/minus.py에서 불러와 사용하고자 한다. 이 경우에는 단순 import 하면 된다.

# expr/minus.py

import plus

def sub(a, b):
    return a - b

if __name__ == "__main__":
    a = 3
    b = 8
    print(plus.add(a, b))

 

 

하위 경로

이번엔 아래와 같이 project 디렉터리에 새로운 파이썬 파일(print_expr.py)을 생성한 뒤, expr/plus.py의 add 함수를 import 하여 사용하고 싶다.

하위 경로 예시 구조

아까와 동일하게 plus를 import 해보았지만, ModuleNotFoundError 에러가 발생했다.

ModuleNotFoundError

print_expr.py의 sys.path를 확인해보자.

print_expr.py의 sys.path

결과에 /home/ubuntu/project/expr 경로가 존재하지 않는 것을 확인할 수 있다.

하위 경로에 위치한 모듈을 import 할 때는 from 절을 사용하여 추가할 수 있다.

from expr import plus

if __name__ == "__main__":
    print(plus.add(1, 2))

from 절

 

 

상위 경로

이번에는 expr/minus.py에서 print_expr.py를 import 하여 사용하고 싶다.

일단 print_expr.py에 호출할 format 함수를 추가했다.

from expr import plus
import sys


def format(result):
    return f"result: {result}"


if __name__ == "__main__":
    print(plus.add(1, 2))

상위 디렉터리 또는 다른 디렉터리에 위치한 모듈을 불러올 때는 sys.path에 불러올 모듈이 위치한 경로를 추가하도록 한다. sys.path는 append 함수를 사용하여 추가할 수 있다.

sys.path.append('/home/ubuntu/project')

이후 print_expr 모듈에 포함된 함수를 사용할 수 있다.

import plus
import sys

sys.path.append('/home/ubuntu/project')
import print_expr

def sub(a, b):
    return a - b

if __name__ == "__main__":
    # print("\n".join(sys.path))
    print(print_expr.format(sub(1, 2)))

 

참고 문서

https://velog.io/@ulr0xb/Python-%EC%83%81%EC%9C%84-%ED%8F%B4%EB%8D%94-import

https://kaizen8501.tistory.com/191?category=958667 

 

728x90