gpt4 book ai didi

python - 在 Python 中动态更改导入的引用

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:55 26 4
gpt4 key购买 nike

:
如果已经导入了同名的不同模块,如何导入模块?我不再需要旧模块了,但我无法以不同的名称导入新模块。importlib.reload() 没有达到预期的效果,显然你真的不应该乱用 sys.modules

上下文:
我正在通过编写脚本 (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。路径在迭代后被移除。
如果 sys.modules 已经包含一个版本的 test_script,

# 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?

跟进:虽然回答了原来的问题,但我想知道,从设计的角度来看,这个解决方案如何?有没有更好/更优雅的方法来自动化这个测试过程?
根据我的发现,重新加载模块并不是好的做法。

最佳答案

在写问题的时候弄明白了。希望有一天它能对某人有所帮助

即使您无法更改 test_script(或 script_b),也有解决方法。
因为如果相关模块已经导入,import 语句什么都不做,我们可以直接从 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)

关于python - 在 Python 中动态更改导入的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47297011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com