Python 3.5与Python 2.7:导入子模块的模块

时间:2017-02-02 17:41:52

标签: python python-2.7 python-3.5 python-module

过去几个小时我一直在谷歌搜索,无法在任何地方找到相同的问题。 2.7和3.5的文档看起来相同,所以我认为这种行为没有记录。

这是我的目录结构:

project
    -- project.py
    -- api
        -- __init__.py
        -- subapi
            -- __init__.py

project/project.py的内容:import api

project/api/__init__.py的内容:import subapi

如果我从projects文件夹中执行python project.py(使用python 2.7),它将返回而不会出现错误。如果我对python 3(python3 project.py)做同样的事情,那么它会与

崩溃
Traceback (most recent call last):
  File "project.py", line 1, in <module>
    import api
  File "/home/me/Documents/project/api/__init__.py", line 1, in <module>
    import subapi
ImportError: No module named 'subapi'

如果我重写import语句以使用相对于projects目录(import api.subapi)的路径,那么它适用于python 2以及3.它不是一个令人满意的解决方案,因为这需要我引用父模块来自子模块内部,这种模式失去了模块性的想法。

有没有人知道我能做些什么来恢复python2的行为?模块搜索算法应使用import语句优先在文件的本地目录中进行搜索。它还应该按照内置模块的优先顺序排列这些文件。尝试导入模块'test'..

- EDIT-- stackoverflow要求我将我的问题与另一个名为“如何进行相对导入”的问题区分开来。我认为这个问题是不同的,因为我特别询问两个版本之间的差异。使用相对导入是解决方案,而不是问题。

1 个答案:

答案 0 :(得分:5)

使用显式相对导入:

from . import subapi