파이썬/기본문법

파이썬 모듈과 매칭된 파일 확인하고 조작하기

코데방 2024. 6. 19.
728x90
import sys

sys.modules

파이썬 모듈이란

 

파이썬 모듈은 확장자가 py로 끝나는 파이썬 파일을 말합니다.

 

결국 기본 라이브러리를 다운받아 import를 하건, 직접 파일을 만들어서 import를 하건 어느 위치에 해당 파일이 있는지 알려주는 것이 모듈이라고 볼 수 있습니다.

 

모듈이란 파이썬파일, import된 모듈은 해당 파일의 위치값을 가진다고 이해하면 편합니다. 

 

 

모듈과 매칭된 파일 위치 보는 법

 

아래와 같이 sys 라이브러리를 사용해 간단히 확인해볼 수 있습니다.

 

"모듈이름 : 모듈객체(파일위치 포함)" 형태의 딕셔너리를 반환합니다. 주의할 점은 딕셔너리의 value값은 문자열이 아닌 'module' 객체라는 점입니다. 

 

import sys

sys.modules

 

 

 

 

모듈 사전에는 import된 형태로 키값이 등록되는 것을 확인할 수 있습니다. 

 

from detection.models import yolo

sys.modules["detection.models.yolo"]

 

 

 

sys.modules 모듈 객체 조작하기

 

욜로 모델 여러개를 한 알고리즘에서 사용하려다보니 아래와 같은 에러를 만났습니다.


Can't get attribute 'ReOrg' on <module 'models.common' from 'C:\\Users\\HS/.cache\\torch\\hub\\ultralytics_yolov5_master\\models\\common.py'>


 

 

해석하자면 "models.common"이라는 이름을 가진 모듈(파일)에 "ReOrg"가 없다 정도로 이해하면 될 듯합니다. 

 

에러 메시지와 같이 현재 sys.modules에 등록돼있는 "models.common"은 "C:\\Users~"의 경로에 있는 "common.py" 파일입니다. 

 

위 에러는 새로운 욜로 모델의 가중치파일(pt)을 torch.load() 함수로 불러오는 과정에 생긴 에러입니다.

 

다 뜯어보진 않았지만 내부적으로 "models.common"에 등록된 모듈이 가중치를 업데이트하는 아키텍쳐를 가지고 있다는 것을 유추할 수 있습니다. 

 

가중치 파일에 대한 아키텍쳐는 다른 경로에 있는 "common,py"파일에 있는데 이전 모델을 torch.hub.load()를 통해 로딩하는 과정에서 내부적으로 해당 모듈 파일 경로를 허브에서 다운된 파일 경로로 설정해둔 것으로 보입니다.

 

따라서 이 문제를 해결하기 위해서는 첫 번째 모델을 torch.hub.load() 로 다운받은 뒤, 두 번째 모델을 torch.load()로 가져오기 전에 "models.common"에 등록된 value값인 "module"객체를 다른 주소를 가진 객체로 교체해줘야합니다.

 

즉,

sys.modules["models.common"] : <기존 경로>   --->   <새로운경로>

로 변경해줘야 한다는 뜻입니다. 

 

values값이 주소값을 가진 문자열이 아닌 module객체이기 때문에 새로운 module 객체를 만들어서 넣어주면 좋을텐데 아직 거기까지 파보진 못한지라.. 다른 방법으로 간단히 해결해봤습니다.

 

 

 

1. 먼저 필요한 모듈을 import 합니다.

from detection.models import common, yolo

 

 

 

2. 위 모듈들은 "detection.models.common"과 같이 sys.modules에 등록됩니다. 따라서 아래와 같이 해당 값을 이용해 기존 값을 교체해줍니다.

 sys.modules["models.common"] = sys.modules["detection.models.common"]
 sys.modules["models.yolo"] = sys.modules["detection.models.yolo"]

 

 

 

위와 같이 에러가 나는 모듈의 파일 위치를 필요한 파일 위치로 바꿔주면 에러를 잡을 수 있습니다. 시간이 없어서 module 객체 만드는 방법은 아직 못알아봤는데 조만간 찾아서 포스팅하도록 하겠습니다.

728x90

댓글

💲 추천 글