【问题标题】:Difference in package importing between Python 2.7 and 3.4Python 2.7 和 3.4 之间的包导入差异
【发布时间】:2015-05-14 23:26:58
【问题描述】:

对于这个目录层次结构:

.
├── hello
│   ├── __init__.py
│   └── world
│       └── __init__.py
└── test.py

还有 Python 源文件:

test.py:

if __name__ == '__main__':
    import hello

你好/__init__.py:

import world

你好/世界/__init__.py:

print("yes you win")

使用 Python 3.4 运行 test.py 会抛出 ImportError 说找不到模块 world,但使用 Python 2.7 一切都很好。

我知道搜索导入的模块时引用了sys.path,所以将目录hello添加到sys.path就可以消除错误了。

但是在 Python 2.7 中,在导入 world 之前,目录 hello 也不在 sys.path 中。是什么导致了这种差异? Python 2.7 中是否应用了任何递归搜索策略?

【问题讨论】:

标签: python python-2.7 import package python-3.4


【解决方案1】:

Python 3 使用绝对导入(参见 @user2357112 指出的 PEP 328)。简而言之,Python 3 从每个 sys.path 条目的根目录开始搜索,而不是首先查询模块目录,就好像它是 sys.path 中的前置条目一样。

要获得您想要的行为,您可以:

  • 明确使用相对导入:hello 包中的 from . import world
  • 使用绝对导入:import hello.world

【讨论】:

  • 是的,我已经阅读了 PEP。我在 Python 2.7 的文档中阅读了有关模块搜索路径 (here) 的信息。在我的例子中,运行test.py会将点(.)目录添加到sys.path,而不是包含world的目录,那么Python 2.7解释器如何找到包world
  • world 是一个。 Python 将包目录world 与同一目录中的模块world.py 视为相同(至少就我们而言)。 __init__.py 是从 inside 世界加载的事实与案例无关。这有意义吗?
  • 是的,它有帮助。也许最好的方法是阅读代码。谢谢:)
  • import .world 在 python 3 中甚至是一个有效的语法吗?我认为你应该这样做from . import world
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 2017-07-08
  • 2014-09-06
  • 1970-01-01
  • 2014-09-13
  • 2021-05-11
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多