Python模块导入 - 显式与隐式相对导入

时间:2013-12-20 14:56:21

标签: python python-import python-module

昨晚,在我的Mac上工作时,我在__init__.py的<{p>}中设置了一些模块导入

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'

我的项目布局

root | _modules
| _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

任何想法会导致什么?我应该看一下配置文件吗?

2 个答案:

答案 0 :(得分:9)

嗯,根据PEP-8导入部分:

  

永远不应该使用隐式相对导入,并且已在Python 3中删除。

由于Python 3.3是导致你麻烦的那个,让你明确导入亲戚模块,我认为这解释了这种情况。可能在Mac上你有Python 2.x,这就是它在那里工作的原因。

查看项目的文件分布,Settings.pyMongoProvider确实是相关模块。这意味着在Python 3中删除隐式相对导入会导致您遇到麻烦,因为导入系统无法找到该模块:

ImportError: No module named 'MongoProvider'

答案 1 :(得分:2)

似乎Mac上的Python版本是2.x而Windows上的Python是3.x。

在使用模块tkinter(在Python 2.x中是Tkinter)之前我遇到了同样的问题。

似乎我们需要使用从XXX.xxx导入xxx导入...●﹏●

我不知道为什么,也许是设计师正在适应Python。