파이썬으로 프로그램을 짤 때, 다른 모듈의 클래스나 함수를 사용하고 싶을 때가 있을 것이다.
필자 역시 그러했고, 그렇게 프로그램을 제작하고 있었다.
그러나 프로젝트의 구조를 바꾸고 나니, 제대로 동작하지 않는 경우가 있었다. 아래 경우를 살펴보자.
😫. 문제 상황
여기서 file1.py가 file2.py 모듈을 사용하기 위해서는 어떻게 해야할까?
여기에 대한 해답은 많은 곳에서 나와있다. 아래와 같이 해결하면 된다.
# file2.py
class Class2:
def __init__(self):
print('This is class in Class2')
# file1.py
# 상위 폴더를 참조할 수 있도록 설정한다.
import sys, os
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
from folder2 import file2
file2.Class2()
위와 같이 실행하면 모듈이 제대로 불러져 Class가 초기화되며 올바르게 실행된다.
그렇다면 아래 상황은 어떨까? 👀
# file3.py
class Class3:
def __init__(self):
print('This is class in Class3')
# file2.py
# 동일한 폴더이기 때문에 그냥 import 해주면 된다.
import file3
class Class2:
def __init__(self):
print('This is class in Class2')
file3.Class3()
이 경우, file1.py에서 file2를 불러온다면 제대로 불러와지겠지?? 라고 생각했다.
하지만...
응...? file2에서 잘만 불러와지는 file3를 불러올 수 없다니.....
🤔. 고민과 해결
인터넷에 찾아봤는데, 나오지가 않았다. 애초에 이 상황을 뭐라 설명할지도 애매했다.. 😓
그래서 고민을 해봤다. 상위 폴더를 참조할 수 있도록 설정하는 이 함수는 무엇일까...
import sys, os
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
import sys, os
print(os.path.dirname(__file__))
print(os.path.abspath(os.path.dirname(__file__)))
print(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
이렇게 보니, 현재 파일의 폴더의 상위 폴더를 찾는 것일 뿐이었다. 그리고 그 상위폴더를 추가하는 것이었다.
💡 그럼 이 과정을 file2에 진행하면 잘 참조할 수 있지되지 않을까?
물론 이번엔 상위 폴더가 아닌, 현재 폴더로 하는 것이다.
# file2.py
# 현재 폴더를 참조할 수 있도록 설정한다. (추가됨)
import sys, os
sys.path.append(os.path.dirname(__file__))
# 동일한 폴더이기 때문에 그냥 import 해주면 된다.
import file3
class Class2:
def __init__(self):
print('This is class in Class2')
file3.Class3()
훌륭하게 실행된다!
'Engineering 💻 > Python' 카테고리의 다른 글
[Python] logging 사용법과 클래스화 (0) | 2022.03.11 |
---|---|
[Python] 크롤링 방법과 비교 (requests, BeautifulSoup, selenium) (1) | 2022.02.17 |