Python:为模块及其导入设置__globals__

时间:2013-06-20 13:55:09

标签: python testing module

我正在使用Python开发测试引擎,但我遇到了一些与模块加载和全局函数相关的问题。

我正在创建的框架的主要思想是加载包含函数和注释“@thisisatest”的Python文件,以告知哪些函数是测试。我用imp.load_source加载这个文件,后者,我生成了从加载模块调用函数的线程。它是这样的:

module = imp.load_source("test", "testdir/test.py")
function = module.testFunction
thread = threading.Thread(target=function)
thread.start()

无论如何,我想连接到这个测试一个“断言函数”,做类似的事情:

module = imp.load_source("test", "testdir/test.py")
module.__globals__.assertAndTerminate = assertionFunction
function = module.testFunction
thread = threading.Thread(target=function)
thread.start()

那没关系。当test.py导入另一个在其中使用assertAndTerminate函数的模块时,问题就开始了。 test.py加载的模块完全不知道来自test.py的__globals__并且不知道我正在谈论的是assertAndTerminate(这是有意义的,因为每个模块都有自己的__globals __)。

有没有人知道我可以为test.py模块和它在线程中加载的模块设置相同的assertAndTerminate函数?我不想在树上搜索导入,是否可能?

有类似Thread(target=function, global_vars=["assertAndTerminate":assertionFunction])的内容吗?

1 个答案:

答案 0 :(得分:3)

您需要在模块上直接设置属性; 该模块的全局命名空间:

module = imp.load_source("test", "testdir/test.py")
module.assertAndTerminate = assertionFunction

拥有来基于每个模块设置全局变量。来自一个模块的Globals不会在导入时传播到其他模块。

可以添加到__builtin__模块(Python 3中的builtin):

import __builtin__

__builtin__.assertAndTerminate = assertionFunction

然后在所有模块中可以看到这些:

>>> import __builtin__
>>> __builtin__.foobar = 'barbaz'
>>> foobar
'barbaz'

一般来说,你真的想要避免这样做。找到一些其他方法来解决您的问题。导入代码而不是依赖于设置的全局变量。