当我尝试在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中的构造不合法,还有其他方法可以做到这一点吗? (
答案 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
对于您的特定情况,由于全球影响,这可能是一个不好的方法。但是,当需要全局重命名时,这可能很有用。