尝试导入与内置模块同名的模块导致导入错误
我有一个模块和一个内置模块发生了冲突。比如说,我在 myapp/email.py
里定义了一个 myapp.email
模块。
在我的代码中,我可以随意引用 myapp.email
,没有任何问题。但是,我需要在我的邮件模块里引用内置的邮件模块。
# myapp/email.py
from email import message_from_string
结果它只找到自己,所以就会出现 ImportError
错误,因为 myapp.email
里没有 message_from_string
这个方法。当我尝试 email.message_from_string
时,import email
也会出现同样的问题。
在 Python 中有没有什么原生的支持可以解决这个问题,还是说我只能把我的 "email" 模块改个更具体的名字呢?
1 个回答
104
你可能想了解一下绝对导入和相对导入,这正好解决了这个问题。你可以使用:
from __future__ import absolute_import
使用这个方法,任何没有修饰的包名都会指向顶层包。然后你需要使用相对导入(from .email import ...
)来访问你自己的包。
注意:上面的from ...
这一行需要放在任何2.x版本的Python的.py
文件中,放在你使用的import ...
行的上面。在Python 3.x中,这已经是默认行为,所以不再需要这样做。