动态模块在Python中从外部函数(或 - 在模块外部编辑globals())导入

时间:2016-02-24 13:20:54

标签: python dynamic import module globals

我有一个项目,我想在其中重复更改类中的代码,然后运行其他模块来测试更改(验证..)。目前,每次编辑后我都要重新加载代码,运行它的测试模块,然后运行测试。我想将这个循环减少到一行,而且,我稍后想要测试不同的类,所以我希望能够将测试类的名称作为参数接收 - 这意味着我需要动态导入。

我为任何模块的干净导入编写了一个函数,它似乎起作用:

def build_module_clean(module_string,attr_strings):
    module = import_module(module_string)
    module = reload(module)
    for f in attr_strings:
        globals()[f]=getattr(module,f)

现在,以清洁的名义,我希望将此功能保存在包装器模块中(它将包含我想要重建的单行程序并每次都测试所有代码),并从各个模块运行它,即在我的ModelChecker模块的import语句中,我会放置行

from wrapper import build_module_clean
build_module_clean('test_class_module',['test_class_name'])

然而,当我这样做时,似乎测试类被添加到包装器模块中的全局变量中,但不会添加到ModelChecker模块中(试图访问globals()['test_class_name']中的ModelChecker给出了一个关键错误)。我已尝试将globalsglobals()作为其他参数传递给build_module_clean,但globals是一个函数(因此测试模块仍然会加载到包装器globals传递然后使用globals()给出错误

TypeError: 'builtin_function_or_method' object does not support item assignment

所以我需要一些方法来编辑另一个模块中的一个模块globals()

或者,(理想情况下?)我想在包装器中导入test_class模块,使其对所有使用它的模块都可见(例如ModelChecker)。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您的功能应如下所示:

build_module_clean(globals(), 'test_class_module', ['test_class_name'])

并称之为:

globals()

说明:

在函数调用(build_module_clean(globals()...)中调用__dict__会在仍然在正确的模块中时抓取模块的String(array.map(UnicodeScalar.init).map(Character.init)) 并将其传递给您的函数。

然后该函数能够(重新)将名称分配给新加载的模块及其当前属性。

请注意,我还(重新)将新加载的模块本身分配给全局变量(您可能不需要该部分)。