このディレクトリ階層の場合:
.
├── hello
│ ├── __init__.py
│ └── world
│ └── __init__.py
└── test.py
そしてPythonソースファイル:
if __name__ == '__main__':
import hello
import world
print("yes you win")
Test.pyをPython 3.4で実行するとImportError
がスローされ、モジュールworld
が見つからないが、Python 2.7すべて結構です。
インポートされたモジュールを検索するときにsys.path
が参照されることを知っているので、ディレクトリhello
をsys.path
に追加するとエラーがなくなります。
しかし、Python 2.7では、world
をインポートする前に、ディレクトリhello
もsys.path
にありません。この違いの原因は何ですか?再帰的なものはありますか? Python 2.7?
Python 3は絶対インポートを使用します(@ user2357112が指摘しているように PEP 328 を参照)。つまり、最初にモジュールのディレクトリをsys.path
の先頭に追加されたエントリであるかのように調べるのではなく、Python 3が各sys.path
エントリのルートから検索します。 。
必要な動作を取得するには、次のいずれかを実行できます。
hello
パッケージのfrom . import world
import hello.world