짧은 :
같은 이름의 다른 모듈을 이미 가져온 경우 어떻게 모듈을 가져올 수 있습니까? 더 이상 이전 모듈은 필요 없지만 새 모듈을 다른 이름으로 가져올 수는 없습니다. importlib.reload()
는 sys.modules
Python에서 가져 오기에서 참조를 동적으로 변경합니다.
상황와 분명히 당신이 정말로해야하지 엉망 원하는 효과를 가지고하지 않습니다 내가 스크립트 (A)를 작성하여 테스트 워크 플로우를 자동화하고있어
. 테스트 스크립트가 제공되며 변경할 수 없습니다.
테스트 대상은 하위 폴더에 다른 버전이있는 스크립트 (B)의 클래스입니다. 불행하게도 스크립트 B와 클래스는 항상 같은 이름을 가지고 있습니다.
main_folder
├──script_a.py
├──test_script.py
│
├──version_1
│ ├──script_b.py
│
├──version_2
│ ├──script_b.py
│
├──version_3
│ ├──script_b.py
테스트 스크립트는 개체를 가져 와서 테스트를 실행합니다.
# test_script
from script_b import my_class
# creat instance of my_class
# and test it
script_a는 버전 폴더를 반복하고 script_b에서 테스트 스크립트를 실행합니다. 각 반복에서 테스트 스크립트가 해당 script_b를 찾을 수 있도록 하나의 하위 폴더가 가져 오기 경로에 추가됩니다. 경로는 반복 후에 제거됩니다. 이미 test_script의 버전을 포함 sys.modules
경우
,
# script_a
import sys
import os
import importlib
folders = ['version_1', 'version_2', 'version_3']
folders = [os.getcwd() + '/' + folder for folder in folders]
for folder in folders:
sys.path.append(folder)
if 'test_script' in sys.modules:
importlib.reload(sys.modules['test_script'])
else:
importlib.import_module('test_script')
sys.path.remove(folder)
문제 : 그것은 reload
보인다
은 test_script을 가져옵니다 script_b에 영향을주지 않습니다. 그래서 다른 하위 폴더로 가져 오기 경로를 변경하더라도 test_script는 항상 버전 1에서 실행됩니다. test_script 자체를 변경하지 않고 test_script의 다른 버전을 script_b로 사용하려면 어떻게해야합니까?
추가 답변 : : 원본 질문에 대한 답변이 있지만 궁금한 점은이 솔루션이 디자인 관점에서 어떻게 보이는지 궁금합니다. 이 테스트 프로세스를 자동화하는 더 좋고/더 우아한 방법이 있습니까?
내가 발견 한 것부터 모듈을 다시로드하는 것이 좋지 않은 것으로 간주됩니다.