我正在使用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])
的内容吗?
答案 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'
一般来说,你真的想要避免这样做。找到一些其他方法来解决您的问题。导入代码而不是依赖于设置的全局变量。