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

78 投票
1 回答
42614 浏览
提问于 2025-04-15 13:21

我有一个模块和一个内置模块发生了冲突。比如说,我在 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中,这已经是默认行为,所以不再需要这样做。

撰写回答