Python 2.7和3.4之间的包导入差异

问题描述:

对于此目录层次结构:

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

和Python源文件:

And the Python source files:

if __name__ == '__main__':
    import hello



hello / __ init __。py:



hello/__init__.py:

import world



hello / world / __ init __。py:



hello/world/__init__.py:

print("yes you win")

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

Running test.py with Python 3.4 throws ImportError saying that module world is not found, but with Python 2.7 everything is fine.

我知道在搜索导入的模块时会引用 sys.path ,因此添加目录 hello sys.path 消除错误。

I know that sys.path is referenced when searching for the imported modules, so adding the directory hello to sys.path eliminates the error.

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

But in Python 2.7, before importing world, the directory hello is not in sys.path either. What causes this difference? Is there any recursive searching policy applied in Python 2.7?

Python 3使用绝对导入(参见 PEP 328 ,@ user2357112指出)。缺点是Python 3从每个 sys.path 条目的根目录进行搜索,而不是首先查询模块的目录,就像它是 sys.path 。

Python 3 uses absolute imports (see PEP 328 as @user2357112 points out). The short of it is that Python 3 searches from the root of each sys.path entry, rather than first consulting the module's directory as if it were a prepended entry in sys.path.

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

To get the behavior you want you can either:


  • 明确使用相对导入:来自。 hello 包中的import world

  • 使用绝对导入: import hello .world

  • Use relative imports explicitly: from . import world in the hello package
  • Use an absolute import: import hello.world