파이썬(Python)/문법

파이썬 폴더위치에 따른 import 방법 (상위,하위,동일 폴더 위치)을 예제로 이해하기

끄적끄적아무거나 2021. 5. 22. 20:59
반응형

Python folder 모듈 import


Python folder 상대적인 위치에 따른 모듈 import 방법

 

일반적으로 *.py 파이썬 파일을 만들고 다른 파일에 함수나 클래스를 가져와서 사용해야 하는 경우가 있다. 하위 폴더에서 단순히 가져 오는 방법은 from 파일명 import 모듈명 방식으로 처리가 가능하다. 하지만 동일 폴더 위치거나 하위 폴더 파이썬 파일에서 상위 파이썬파일의 모듈을 가져올 때 해당 방식이 적용되지 않는다. 그럴 때는 아래와 같은 순서로 해결 한다.

 

1. import sys 를 한다.

2. import os 를 한다.

3. sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) 를 실행한다.

4. 그 뒤 상위 파일에서 다른 파일을 import 하는 방식으로 진행한다.

 

설명만으로는 이해가 어려우니 아래 예제로 간단히 알아보자.

 


예제를 통해 이해하기

 

폴더 구성>>

그림1

그림1처럼 상위에는 folder_up 폴더와 main_00.py, main_01.py 파이가 있고 folder_up 폴더 안에 up_func_00.py, up_func_01.py, up_func_02.py 파일이 들어가 있다.

 

코드 main_00.py>>

from folder_up import up_func_00

print(up_func_00.test())

 

코드 main_01.py>>

def test():
    return "this is from main_01.py"

 

코드 up_func_00.py>>

def test():
    return "this is from up_func.py"

 

코드 up_func_01.py>>

import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))

from folder_up import up_func_00
# import up_func_00

print(up_func_00.test())

 

코드 up_func_02.py>>

import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))

import main_01

print(main_01.test())

 

결과 - main_00.py 실행>>

this is from up_func.py

 

주석- main_00.py 실행>>

상위 파이썬 파일이기 때문에 단순히 from import를 사용해서 해당 모듈을 import 하고 실행하였다.

 

 

결과 - up_func_01.py>>

this is from up_func.py

 

주석 - up_func_01.py>>

동일 폴더 안에서 up_func_00.py 를 가져오는 것이다. 여기서 아래 코드가 실행되었다.

sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))

위 코드에서 __file__ 은 현재 파일(up_func_01.py)의 위치를 말하는 것이고 위 코드는 현재 파일을 상위에 위치하게 하는 것과 마찬가지 효과를 준다. 그래서 from ~ import 를 사용해서 모듈을 가져왔다.

 

여기서 한가지 포인트는 주석 처리되어 있는 import를 그냥 사용해도 실행은 된다. 하지만 다음과 같은 warning 메세지를 받게 된다.

"Import "up_func_00" could not be resolved Pylance (reportMissingImports)"

즉, visual studio가 어떤 식으로 동작을 원하는지 알고 있어서 실행을 해준 것이지만 방법이 잘못되었다는 의미이다.

 

 

결과 - up_func_02.py>>

this is from main_01.py

 

주석 - up_func_02.py>>

앞서 up_func_01.py 주석에서 설명한 것과 같이 sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) 를 통해 up_func_02.py 파일을 상위에 위치하게 만들고 상위 파일간에 모듈 import는 단순 import로만 실행할 수 있다. 

 

 

 

 

반응형