반응형

오랫만입니다. 이번 시간에는 파이썬의 sys.path에 대해 간단하게 알아보겠습니다.

 


 먼저, testmodule 프로젝트를 하나 만들었습니다. 프로젝트의 구조는 main.py가 있고, t1 패키지 아래에 cron.py가 있는 구조입니다. cron.py에 있는 test_cron은 test_cron_1을 출력합니다.

 

 

 t1.cron으로부터 test_cron을 import 하면 의도대로 잘 동작할까요? 같은 프로젝트 폴더 내에 있으니, 잘 찾아갈 겁니다.

 

 

 test_cron_1이 잘 출력됩니다.

 

 

 이제, 제가 testmodule2라는 프로젝트를 새로 하나 만들었습니다. t2라는 패키지가 있고요. 그 아래에 cron.py가 있습니다. 이 파일 안에는 test_cron 함수가 있습니다.

 

 testmodule1에 있는 main.py를 실행시켜 보겠습니다. 그러면, 잘 동작할까요?

 

 

 그렇지 않습니다. testmodule1에서, t2라는 이름을 가진 module을 찾을 수 없기 때문입니다. 읽어오지 못하는 것입니다. 왜 그럴까요? 공식 문서를 보면, sys.path는 모듈을 위해서 찾기 시작하는 위치들임을 알 수 있습니다. 이것 안에 있는 경로들을 읽어내면, 왜 t2를 못 읽어왔는지 알 수 있을 겁니다.

 

 


 sys.path에 있는 것들을 모두 꺼내와 봅시다. for문으로 순회 한 번 하면 되니까 이는 복잡하진 않습니다.

 

 

 보니까, 딱히 어려운 건 없어 보이네요. testmodule 아래에 있는 것, python39 아래에 있는 것들, venv에 있는 것들을 긁어옴을 알 수 있어요. 우리가 자주 쓰는 collections 같은 경우에는, 저 경로에 포함되어 있습니다.

 

 

 그러니, collections은 무의식적으로 import 할 수 있었던 셈입니다. 그 어디를 봐도, testmodule2에 대한 것은 없습니다. 그러니, 우리가 무의식적으로 import 하던 collections와는 다르게 모듈을 찾을 수 없다는 오류를 뱉어내는 것입니다. 해당 경로를 sys.path에서 제거한 후에 collections를 import 해 보겠습니다.

 

 

 간단하게 remove 메서드를 이용하면 그렇게 할 수 있습니다.

 

 

 재밌게도, collections를 찾을 수 없다는 ModuleNotFoundError가 발생하였습니다. 이는, collections를 찾아갈 수 있는 메타 정보를 제거해 버렸기 때문입니다. 이를 통해, sys.path에는 모듈을 찾아가기 위한 시작점, 즉 메타 정보들이 저장되어 있음을 알 수 있습니다.

 


 그러면, testmodule2 아래에 있는 t2 패키지의 cron.py 안에 있는 test_cron을 실행시키기 위해서는 어떻게 하면 될까요?

 

 sys.path에 testmodule2에 대한 정보를 추가해 주면 됩니다. 그러면, testmodule2의 t2 패키지 아래에 있는 cron.py 안에 있는 함수 test_cron으로 찾아가기 위한 메타 정보가 들어가게 됩니다.

 

 

 실행 결과는 위와 같습니다.

반응형

댓글을 달아 주세요

  1. 곰곰지영

    오호 뭔가 복잡해보이지만 잘 해결된 느낌이네요
    잘 읽고 갑니다. 좋은 하루 보내세요 :)