【问题标题】:Python 3.5 vs Python 2.7: Modules importing submodulesPython 3.5 vs Python 2.7:模块导入子模块
【发布时间】:2017-06-19 22:01:41
【问题描述】:

过去几个小时我一直在谷歌上搜索这个问题,但在任何地方都找不到类似的问题。 2.7 和 3.5 的文档也似乎相同,所以我认为没有记录这种行为。

这是我的目录结构:

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

project/project.py的内容:import api

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

如果我从项目文件夹中执行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 api.subapi) 的路径,那么它适用于 python 2 和 3。但这不是一个令人满意的解决方案,因为这需要我从内部引用父模块子模块破坏了模块化的想法..

有谁知道我可以做些什么来恢复 python2 的行为?模块搜索算法应该优先使用 import 语句在文件的本地目录中搜索。顺便说一下,它还应该优先考虑这些文件在内置模块之上。尝试导入模块“测试”..

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

【问题讨论】:

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


【解决方案1】:

使用显式相对导入:

from . import subapi

【讨论】:

  • 有效!我仍然很困惑为什么他们选择更改 python 3 中的导入行为。也许他们想强迫人们使用平面模块层次结构(不像 nodejs)
  • @Phil。绝对不。它们实际上使编写嵌套库变得更加容易。
  • @user2357112 感谢您提供该链接。我引用:“建议默认情况下所有导入语句都是绝对的(仅搜索 sys.path),并使用特殊语法(前导点)来访问包相对导入”
猜你喜欢
  • 2016-07-27
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多