【问题标题】:importing module elements in another with no qualified name在另一个没有限定名称的情况下导入模块元素
【发布时间】:2013-01-23 01:51:06
【问题描述】:

我的问题很简单,但我找不到一个好的答案,因为搜索引擎对“模块”一词的含糊不清。 我想做的大致是这样的:

模块:a.py

x = 2

模块:b.py

import a

现在,我希望能够在不使用限定名称的情况下从 b 访问 x(即不输入 a.x,只需使用 x)。在我的情况下,我无法使用:

from a import x

因为我不知道a 将包含哪些元素。我不能用

from a import *

两者都不是。有没有简单的方法来合并或加入模块(我的意思是对象模块)?

【问题讨论】:

  • 你想要的不多,是吗?
  • 为什么不能使用from a import *

标签: python python-import


【解决方案1】:

不是一个好主意,但你可以使用:

globals().update(vars(a))

a 模块中定义的所有 名称添加到本地命名空间。这与from a import * 几乎相同。要完全模拟 from a import *,而不使用 from a import * 本身,您必须使用:

globals().update(p for p in vars(a).items() if p[0] in getattr(a, '__all__', dir(a)))

您通常只会使用x = a.xfrom a import x

如果您使用zipimport,则无需执行任何操作。只需将存档路径添加到您的sys.path

import sys
sys.path.insert(0, '/path/to/archive.zip')
from test import x

【讨论】:

  • 事实上,我不想从 a 导入所有名称,只是其中的一些(取决于它们的类型)。我会尝试你的解决方案,但我认为有一个“更安全”的替代方法来更新 globals()
  • @ibi0tux:目前还不清楚为什么使用x = a.x 而这不是你能做的。将名称动态添加到您的命名空间需要操作 globals() 或使用 exec,而当 globals() 可以使用时,我不推荐后者。
  • 实际上模块是用 zipimport 导入的,我有类似的东西:a = zipimport . zipimporter ( "archive.zip" )mod_a = a . load_module ( "test" ) # considering archive.zip contains a module testprint mod_a . value # considering value is defined in module test有没有办法直接在全局中导入?
  • @ibi0tux:看,你为什么没有在你的问题中发布?您可以将 zip 模块添加到您的 sys.path 并正常导入。
  • 这是否意味着我不需要使用 zipimport ?
猜你喜欢
  • 2018-11-10
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2011-02-08
  • 2022-08-21
  • 2017-02-12
  • 2022-12-07
相关资源
最近更新 更多