为了缩短它,我有一个模块可以做到这一点:
MyModule
----mymodule.py
----__init__.py
mymodule.py
# Get the name of the current module
current_module = __import__(__name__)
setattr(current_module, 'VarA', 5)
因此,如果我位于MyModule文件夹内并打开一个shell,则以下工作:
import mymodule
print mymodule.VarA
但如果我在MyModule文件夹之外进行了本地化并执行:
from MyModule import mymodule
print mymodule.VarA
我得到:'module' object has no attribute 'VarA'
,我认为这是因为setattr
正在其他地方设置VarA
,这是做什么的,所以VarA
在mymodule中可用我从哪里导入模块的问题?
答案 0 :(得分:1)
如果您阅读了__import__
的文档:
当name变量的格式为
package.module
时,通常会返回顶级包(直到第一个点的名称),不由名称的。但是,当给出非空的fromlist参数时,将返回由 name 命名的模块。
你可以很容易地看到这一点。
MyModule的/ 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
编辑您,所以只需执行此操作:
import sys
current_module = sys.modules[__name__]
setattr(current_module, 'VarA', 5)
当然,最简单的解决方案是:
VarA = 5
...但可能有一个很好的理由不适用于您的真实代码。