首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python:为模块及其导入设置__globals__

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

Stack Overflow用户
提问于 2013-06-20 21:55:09
回答 1查看 529关注 0票数 2

我正在用Python开发一个测试引擎,但我面临着一些与模块加载和全局函数相关的问题。

我正在创建的框架的主要思想是加载一个包含函数和注释"@thisisatest“的Python文件,以确定哪些函数是测试。我用imp.load_source加载这个文件,然后从加载的模块中产生调用函数的线程。大概是这样的:

代码语言:javascript
运行
复制
module = imp.load_source("test", "testdir/test.py")
function = module.testFunction
thread = threading.Thread(target=function)
thread.start()

无论如何,我想要将这个测试连接到一个“断言函数”,执行如下操作:

代码语言:javascript
运行
复制
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])这样的东西

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-20 22:01:52

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

代码语言:javascript
运行
复制
module = imp.load_source("test", "testdir/test.py")
module.assertAndTerminate = assertionFunction

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

您可以添加到__builtin__模块(Python3中的builtin):

代码语言:javascript
运行
复制
import __builtin__

__builtin__.assertAndTerminate = assertionFunction

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

代码语言:javascript
运行
复制
>>> import __builtin__
>>> __builtin__.foobar = 'barbaz'
>>> foobar
'barbaz'

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17215514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档