web-dev-qa-db-ja.com

Python 2.7と3.4の間のパッケージインポートの違い

このディレクトリ階層の場合:

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

そしてPythonソースファイル:

test.py:

if __name__ == '__main__':
    import hello

hello/__ init__。py:

import world

hello/world/__ init__。py:

print("yes you win")

Test.pyをPython 3.4で実行するとImportErrorがスローされ、モジュールworldが見つからないが、Python 2.7すべて結構です。

インポートされたモジュールを検索するときにsys.pathが参照されることを知っているので、ディレクトリhellosys.pathに追加するとエラーがなくなります。

しかし、Python 2.7では、worldをインポートする前に、ディレクトリhellosys.pathにありません。この違いの原因は何ですか?再帰的なものはありますか? Python 2.7?

16
PJ.Hades

Python 3は絶対インポートを使用します(@ user2357112が指摘しているように PEP 328 を参照)。つまり、最初にモジュールのディレクトリをsys.pathの先頭に追加されたエントリであるかのように調べるのではなく、Python 3が各sys.pathエントリのルートから検索します。 。

必要な動作を取得するには、次のいずれかを実行できます。

  • 相対インポートを明示的に使用します:helloパッケージのfrom . import world
  • 絶対インポートを使用します:import hello.world
12
Sean Vieira