我正在用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])
这样的东西
发布于 2013-06-20 14:01:52
您需要直接在模块上设置属性;这是该模块的全局名称空间:
module = imp.load_source("test", "testdir/test.py")
module.assertAndTerminate = assertionFunction
您必须在每个模块的基础上设置全局变量。导入时,来自一个模块的全局变量不会传播到其他模块。
您可以添加到__builtin__
模块(Python3中的builtin
):
import __builtin__
__builtin__.assertAndTerminate = assertionFunction
然后在所有模块中都可以看到这些内容:
>>> import __builtin__
>>> __builtin__.foobar = 'barbaz'
>>> foobar
'barbaz'
一般来说,你真的想避免这样做。找一些其他的方法来解决你的问题。导入代码,而不是依赖于设置的全局变量。
https://stackoverflow.com/questions/17215514
复制相似问题