【问题标题】:importlib.reload() and exec() in PythonPython 中的 importlib.reload() 和 exec()
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 谢谢!毕竟,这非常简单。如果我早点检查的话,本可以为我节省很多工作..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2018-12-19
  • 2012-07-04
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多