试图导入与内置模块同名的模块将导致导入错误

我有一个与内置模块冲突的模块,例如,在 myapp/email.py中定义的 myapp.email模块。

我可以引用 myapp.email在任何地方在我的代码没有问题。但是,我需要从我的电子邮件模块中引用内置的电子邮件模块。

# myapp/email.py
from email import message_from_string

因为 myapp.email没有 message_from_string方法,所以它只能找到自己,因此引发一个 ImportError。当我尝试 email.message_from_string时,import email会导致同样的问题。

是否有任何原生的支持在 Python 中实现这一点,或者我必须将我的“ email”模块重命名为更具体的东西?

38859 次浏览

你会想阅读关于 绝对进口与相对进口的文章,它解决了这个问题。使用:

from __future__ import absolute_import

使用它,任何未修饰的包名都将始终引用顶级包。然后需要使用相对导入(from .email import ...)来访问您自己的包。

注意: 上面的 from ...代码行需要放到您正在使用的 import ...代码行之上的任何2.x Python .py文件中。在 Python 3.x 中,这是默认行为,因此不再需要。