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

1 投票
1 回答
2430 浏览
提问于 2025-04-18 10:02

这件事有点复杂,但请耐心听我说。

我在使用图形界面(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当作它的一部分。不过!如果我直接在终端运行相同的代码,它是可以工作的。

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

1 个回答

2

你正在把每个名字和sys.modules里的键进行比较。但是,那个字典里的就是模块本身,你应该可以把它们传给reload()函数。

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

撰写回答