2

我正在用 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])

4

1 回答 1

3

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

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

必须在每个模块的基础上设置全局变量。来自一个模块的全局变量不会在导入时传播到其他模块。

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

import __builtin__

__builtin__.assertAndTerminate = assertionFunction

这些在所有模块中都可见:

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

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

于 2013-06-20T14:01:51.747 回答