0

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

MyModule
----mymodule.py
----__init__.py

我的模块.py

# Get the name of the current module
current_module = __import__(__name__)
setattr(current_module, 'VarA', 5)

因此,如果我位于 MyModule 文件夹内并打开一个外壳,则以下工作:

import mymodule
print mymodule.VarA

但是,如果我在 MyModule 文件夹之外进行本地化并执行以下操作:

from MyModule import mymodule
print mymodule.VarA

我得到:'module' object has no attribute 'VarA',我想这正在发生,因为setattr正在VarA其他地方设置,VarA无论我从哪里导入模块,都可以在 mymodule 中执行什么操作?

4

1 回答 1

1

如果您阅读以下文档__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在其上使用自定义导入逻辑或类似的东西,那么您一开始就不需要这种复杂性。一定有人已经imported 你了,所以这样做:

import sys
current_module = sys.modules[__name__]
setattr(current_module, 'VarA', 5)

当然,这里最简单的解决方案是:

VarA = 5

......但大概有一个很好的理由在你的真实代码中不起作用。

于 2013-10-01T01:21:09.613 回答