如果您阅读以下文档__import__
:
当 name 变量是 formpackage.module
时,通常返回顶层包(直到第一个点的名称),而不是name命名的模块。但是,当给定非空 fromlist 参数时,将返回按名称命名的模块。
你可以很容易地看到这一点。
我的模块/mymodule.py:
current_module = __import__(__name__)
print current_module
您的程序将打印出如下内容:
<module 'MyModule' from '/Users/abarnert/src/test/pkgtest3/MyModule/__init__.pyc'>
如果您使用的是 Python 2.7,则可以略过文档的其余部分,直到这一部分:
如果您只想按名称导入模块(可能在包中),请使用importlib.import_module()
.
所以,只需这样做:
import importlib
current_module = importlib.import_module(__name__)
setattr(current_module, 'VarA', 5)
如果您需要使用早期的 2.x 版本,请阅读整个部分(对于您的 Python 版本,而不是我上面链接的 2.7)。正确的答案有点复杂,而且有点 hacky:
import sys
current_package = importlib.import_module(__name__)
current_module = sys.modules[__name__]
setattr(current_module, 'VarA', 5)
当然,如果您永远不会将 MyModule/mymodule.py 作为顶级脚本运行,或者execfile
在其上使用自定义导入逻辑或类似的东西,那么您一开始就不需要这种复杂性。一定有人已经import
ed 你了,所以这样做:
import sys
current_module = sys.modules[__name__]
setattr(current_module, 'VarA', 5)
当然,这里最简单的解决方案是:
VarA = 5
......但大概有一个很好的理由在你的真实代码中不起作用。