2

짧은 :
같은 이름의 다른 모듈을 이미 가져온 경우 어떻게 모듈을 가져올 수 있습니까? 더 이상 이전 모듈은 필요 없지만 새 모듈을 다른 이름으로 가져올 수는 없습니다. importlib.reload()sys.modulesPython에서 가져 오기에서 참조를 동적으로 변경합니다.

상황와 분명히 당신이 정말로해야하지 엉망 원하는 효과를 가지고하지 않습니다 내가 스크립트 (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로 사용하려면 어떻게해야합니까?

추가 답변 : : 원본 질문에 대한 답변이 있지만 궁금한 점은이 솔루션이 디자인 관점에서 어떻게 보이는지 궁금합니다. 이 테스트 프로세스를 자동화하는 더 좋고/더 우아한 방법이 있습니까?
내가 발견 한 것부터 모듈을 다시로드하는 것이 좋지 않은 것으로 간주됩니다.

답변

1

질문을 쓰는 동안 알아 냈습니다. 언젠가 누군가를 도울 수 있기를 바랍니다.

test_script (또는 script_b)를 변경할 수없는 경우에도 해결 방법이 있습니다.
관련 모듈을 이미 가져온 경우 가져 오기 명령문이 아무런 작업도 수행하지 않기 때문에 script_a에서 직접 원하는 경로에서 script_b를 다시로드 할 수 있습니다. sys.modules에서 새 버전으로 바뀌기 때문에 test_script의 import 문은 문제가되지 않습니다.

업데이트 코드 :

# 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['script_b'])  # this line added 
     importlib.reload(sys.modules['test_script']) 
    else: 
     importlib.import_module('test_script') 

    sys.path.remove(folder) 
관련 문제