基本上,我想强制一个变量,让我们在插件加载之前jim
将他调用到我作为全局加载的插件中,例如:
load_plugin('blah', variables={'jim':1}) #For instance
然后在里面blah.py
:
print jim #prints 1
有什么简单的方法可以做到这一点?如果它不在标准库中,这没什么大不了的。
基本上,我想强制一个变量,让我们在插件加载之前jim
将他调用到我作为全局加载的插件中,例如:
load_plugin('blah', variables={'jim':1}) #For instance
然后在里面blah.py
:
print jim #prints 1
有什么简单的方法可以做到这一点?如果它不在标准库中,这没什么大不了的。
不 -在首先导入插件之前没有办法做到这一点- 所以,如果你的变量被用于模块主体本身,你就不走运了。
如果变量在模块的函数或方法(但不是类主体)中用作全局变量,则可以在导入模块后更改它,只需执行以下操作:
import module
module.jim = 5
你可能知道。(而且我知道这不是您要的)。
因此,实现这一目标的唯一方法是解析模块的源代码,并在那里更改变量分配,保存源代码并导入它。好的,有办法用内存中的源代码模拟导入,但是这种方法太不切实际了,我们不应该详细说明。
如果您可以控制要以这种方式进行猴子补丁的模块的源代码,我的建议是使用一个配置文件,模块将从该配置文件中选择变量名。
然后生成配置文件,执行导入(注意它尚未导入到 sys.modules 中),然后就完成了。
您可以使用__import__函数。它允许您覆盖全局变量。
例如:
__import__('blah', dict(jim=1, **globals()))