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

Python中的importlib.reload()和exec(),python,string,import,exec,reload,Python,String,Import,Exec,Reload,这将有点复杂,但请容忍我 我在重新装填方面有点麻烦。我通过GUI在Python中运行unittests,我希望能够在不重新启动应用程序的情况下对测试进行更改 为此,我尝试使用importlib.reload。但是,importlib.reload需要一个模块作为参数,我只能以字符串的形式访问导入的模块名称。为了绕过这个问题,我尝试使用exec(),如下所示: def loadSuite(testModules): # Initialize the test suite suite =

这将有点复杂,但请容忍我

我在重新装填方面有点麻烦。我通过GUI在Python中运行unittests,我希望能够在不重新启动应用程序的情况下对测试进行更改

为此,我尝试使用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视为其中的一部分。 然而!如果我直接在终端中运行相同的代码,它就会工作


我从哪里开始尝试修复此问题?

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


你的应用程序树是什么(文件夹,
\uuuu init\uuuuuy.py
文件等)?它不是你问题的解决方案,也许是你的需要。我还需要运行动态不同的测试。为了不重新加载某些代码,我选择了配置文件的方法。为什么需要
exec
?只需执行导入lib.reload(sys.modules[modulename])为什么要执行
alreadyiimported=sorted(sys.modules.keys())
?如果系统模块中有t,则可以使用
检查dict键是否存在。这会快得多,因为它可以使用哈希进行快速查找,而不是逐个检查键。谢谢!毕竟,这是出人意料的简单。如果我早一点检查的话,我可以省下很多工作。。
if t in alreadyImported:
    importlib.reload(sys.modules[t])