从别名模块导入名称。可能吗?

时间:2013-08-13 17:40:01

标签: python python-import

当我尝试在Python中执行以下构造时,我得到,"No module named foo" 在第二行

import my_package.my_very_long_module_name as foo
from foo import f1, f2, f3
from foo import a, b, c
from foo import x, y, z

my_very_long_module_name是文件夹my_very_long_module_name.py中的一个模块(my_package)(该文件夹包含文件__init__.py)。

为什么上面的第二行失败?我不允许从别名模块导入名称吗?

如果Python中的构造不合法,还有其他方法可以做到这一点吗? (

3 个答案:

答案 0 :(得分:4)

import my_package.my_very_long_module_name as foo
from foo import f1, f2, f3

第二行失败,因为python将尝试查找模块名foo.py,它不会使用您刚刚导入的变量foo

您可以尝试这样的事情:

import my_package.my_very_long_module_name as foo
f1, f2, f3 = foo.f1, foo.f2, foo.f3
del foo

答案 1 :(得分:1)

虽然你不能在import语句中使用变量是正确的,但你可以简单地访问模块的变量。

因此,您可以这样做:

a = foo.a

如果你坚持,你甚至可以写信给globals。但老实说,我鼓励您在代码中使用合格的foo.a。它会让它更具可读性。

答案 2 :(得分:1)

我要修改sys.modules字典可以完成你想要实现的目标。

import sys
import my_package.my_very_long_module_name as foo

sys.modules['foo'] = foo
from foo import f1, f2, f3
from foo import a, b, c
from foo import x, y, z


警告:执行此操作会为此python会话全局注册foo,因此尝试import foo的所有其他模块将以my_package.my_very_long_module_name

结束

对于您的特定情况,由于全球影响,这可能是一个不好的方法。但是,当需要全局重命名时,这可能很有用。