2016-01-23 3 views
5

この場合、Python 3では__init__.pyは必要ありませんか?私が持っていると仮定し

src/ 
    __init__.py 
    a.py 
b.py 

と仮定__init__.pyは空のファイルで、a.pyはただ1行です:

TESTVALUE = 5 

と仮定b.pyです:

はPython 2.7の両方で今
from src import a 

print(a.TESTVALUE) 

Python 3.xでb.pyを実行すると結果(5)が得られます。

しかし、b.py、私はファイル__init__.pyを削除した場合は、まだPythonの3.xの中で動作しますが、Pythonの2.7で、私はエラーを取得:

Traceback (most recent call last): 
    File "b.py", line 5, in <module> 
    from src import a 
ImportError: No module named src 

はなぜPythonの2.7は、このような状況では異なる挙動を示すのか?

答えて

8

__init__.pyファイルなしで動作するPython 3はnamespace packagesをサポートしています。 さらに、これらのパッケージは複数のディレクトリに分散することができます。つまり、ファイル*.pyを含むsys.pathのすべてのディレクトリがパッケージとして認識されます。

これは、Python 3におけるインポートの下位互換性を損なっています。典型的な問題は、現在の作業ディレクトリ内で、numpyなどのライブラリのような名前を持ち、Pythonファイルを含むディレクトリです。 Python 2はこのディレクトリを無視しますが、Python 3は最初にそれを見つけてそこからライブラリをインポートしようとします。これは私に何度か噛まれている。

関連する問題