Python模块导入 - 明确导入与隐式相对导入

15
昨晚我在我的 Mac 上工作时,在我的 __init__.py 中设置了一些模块导入。
from MongoProvider import MongoProvider
from Settings import Settings

等等,我不确定那台机器上Python的版本。等我获取到信息后,我将编辑问题。

今天,我在另一台机器上工作,它是Windows系统,并且使用Python 3.3.3版本,但我的模块导入出现了问题。通过添加显式相对导入(添加一个前导点),我解决了这个问题。

from .MongoProvider import MongoProvider
from .Settings import Settings

我收到的跟踪信息如下:
Traceback (most recent call last):
File "app.py", line 5, in <module> from modules.route_handlers import Route_Handlers
File "C:\Users\willb\bearded-dubstep\modules\route_handlers\Route_Handlers.py", line 9, in <module> from modules.backend_providers import Settings
File "C:\Users\willb\bearded-dubstep\modules\backend_providers\__init__.py", line 1, in <module> from MongoProvider import MongoProvider
ImportError: No module named 'MongoProvider'

我的项目布局是

根目录
|_模块
  |_api_helpers
    |  __init__.py
    |  InvalidUsage.py
    |  response_utils.py
  |_backend_providers
    |  __init__.py
    |  MongoProvider.py
    |  Settings.py
  |_route_handlers
    |  __init__.py
    |  Route_Handlers
|  app.py

有什么想法会导致这个问题?是否应该查看配置文件?


这是哪个Python版本? - Simeon Visser
Windows正在使用3.3.3版本。我不确定我的Mac上有什么。无论现在运送的股票是什么。 - William
你能提供更多信息吗?比如Windows中的异常?你的项目文件布局等等? - Paulo Bu
2个回答

11
根据PEP-8的导入部分,
隐式相对导入不应使用,并且已在Python 3中删除。
由于Python 3.3给您带来了麻烦,让您明确导入相关模块,我认为这解释了情况。可能在Mac上您有Python 2.x,这就是为什么它在那里工作的原因。
查看您项目的文件分布,Settings.pyMongoProvider确实是相关模块。这意味着Python 3中删除了隐式相对导入,这是导致您出现问题的原因,因为导入系统无法找到该模块:
ImportError: No module named 'MongoProvider'

2

看起来你的 Mac 上的 Python 版本是 2.x,而 Windows 上的 Python 是 3.x。

我之前使用 tkinter 模块(Python 2.x 中为 Tkinter)时也遇到了相同的问题。

似乎我们需要使用 from XXX.xxx import xxx 来导入……●﹏●

我不知道为什么,可能是设计师调整到了 Python。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接