gpt4 book ai didi

python - Python 中的 importlib.reload() 和 exec()

转载 作者:行者123 更新时间:2023-12-01 05:10:51 28 4
gpt4 key购买 nike

这会有点复杂,但请耐心等待。

我在重新加载时遇到了一些问题。我通过 GUI 在 Python 中运行单元测试,并且希望能够在无需重新启动应用程序的情况下对测试进行更改。

为此,我尝试使用 importlib.reload。但是, importlib.reload 需要一个模块作为参数,我只能以字符串形式访问导入的模块名称。为了绕过这个问题,我尝试使用 exec() ,如下所示:

def loadSuite(testModules):

# Initialize the test suite
suite = unittest.TestSuite()

alreadyImported = sorted(sys.modules.keys())
# For the unit tests for each control module found in testModules
for t in testModules:
if t in alreadyImported:
exec("importlib.reload " + "(" + t + ")")
suite.addTests(unittest.defaultTestLoader.loadTestsFromName(t))
return suite

测试按应用程序划分在子目录中,如下所示: 根程序目录\Application1\Test1

如果重新加载的文件位于主文件夹中,我的方法似乎工作正常。问题是: importlib.reload() 有时会出现子目录问题。如果我尝试运行我的代码

t = "Application1.Test1"
exec("importlib.reload " + "(" + t + ")")

我明白了

NameError: name 'Application1' is not defined

这可能是因为它试图将 Application1 视为一个模块,并将 Test1 视为其中的一部分。然而!如果我直接在终端中运行相同的代码,它就可以工作。

我从哪里开始尝试解决这个问题?

最佳答案

您正在将每个名称与 sys.modules 中的键进行比较。但是该字典中的是模块本身,您应该能够将其传递给 reload()。

if t in alreadyImported:
importlib.reload(sys.modules[t])

关于python - Python 中的 importlib.reload() 和 exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24258772/

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