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

时间:2014-06-17 08:08:47

标签: python string import exec reload

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

我在重装方面遇到了一些麻烦。我通过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视为其中的一部分。 然而!如果我直接在终端中运行相同的代码,它就可以工作。

我甚至在哪里开始尝试修复此问题?

1 个答案:

答案 0 :(得分:2)

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

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