在导入模块中设置属性时修复路径导入

时间:2013-10-01 01:04:58

标签: python module setattr

为了缩短它,我有一个模块可以做到这一点:

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中可用我从哪里导入模块的问题?

1 个答案:

答案 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

...但可能有一个很好的理由不适用于您的真实代码。