Welcome! 🙋‍♂️ View more

Engineering 💻/Python

[Python] 참조한 모듈이 다른 모듈을 참조할 수 없는 경우 해결 (다른 모듈 참조하기)

DeepFlame 2022. 2. 18. 21:40

파이썬으로 프로그램을 짤 때, 다른 모듈의 클래스나 함수를 사용하고 싶을 때가 있을 것이다. 

필자 역시 그러했고, 그렇게 프로그램을 제작하고 있었다. 

그러나 프로젝트의 구조를 바꾸고 나니, 제대로 동작하지 않는 경우가 있었다. 아래 경우를 살펴보자. 

 

 

😫. 문제 상황


Test 프로젝트의 구조

여기서 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()

훌륭하게 실행된다!