【发布时间】:2014-08-07 04:02:25
【问题描述】:
这会有点复杂,但请耐心等待。
我在重新加载时遇到了一些麻烦。我正在通过 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:名称“Application1”未定义
这可能是因为它试图将 Application1 视为一个模块,而将 Test1 视为它的一部分。 然而!如果我直接在终端中运行相同的代码,它就可以工作。
我什至从哪里开始尝试解决这个问题?
【问题讨论】:
-
你的应用程序树是什么(文件夹,
__init__.py文件,...)? -
这不是您的问题的解决方案,但可能是您的需求。我还需要运行动态不同的测试。为了不重新加载某些代码,我选择了一种带有配置文件的方法。
-
为什么需要
exec?就做importlib.reload(sys.modules[modulename]) -
你为什么要
alreadyImported = sorted(sys.modules.keys())?您可以使用if t in sys.modules检查字典键是否存在。它会快很多,因为它可以使用哈希进行快速查找,而不是一个一个地遍历键。
标签: python string import exec reload