2015-12-25 11 views
23

私はPythonには新しく、パッケージを作成するときにわかる問題を理解しようとしています。 私は、次のファイル構造を有する:(ワーキング・ディレクトリが/私の/ Pythonの/ jmLib2です)python3:ImportError:xxxxという名前のモジュールがありません

/my/Python/jmLib2 
    |--- Phone 
    |  |--- __init__.py 
    |  |--- Pots.py 
    |- Test2.py 

--------------------------------- 
cat ./jmLib2/Pots.py 
#!/usr/bin/python 

def Pots(): 
    print ("I'm Pots Phone") 

--------------------------------- 
cat ./jmLib2/__init__.py 
from Pots import Pots 

--------------------------------- 
cat ./Test2.py 
#!/usr/bin/python 
from Phone import Pots 

import os.path 
print ("OS:"+str(os.path)) 

Pots() 

私が今やるとき:I場合、

python2 Test2.py 
OS:<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'> 
    I'm Pots Phone* 

GREAT ...しかし、 do:

python3 Test2.py 
Traceback (most recent call last): 
    File "Test2.py", line 2, in <module> 
    from Phone import Pots 
    File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module> 
    from Pots import Pots 
ImportError: No module named 'Pots' 

私はPyDevをEclipseで使用しています。 PyDevは .pyファイルの中に "未解決のインポート:ポット"エラーを報告します。 私はPyDevとbashで同じトレースバック問題を抱えています。

もう一度、私はPythonを初めて使っています...だから、おそらく非常にばかげたミスです。 誰かが私に説明することができます、python2とpython3.4の違いは? PYTHONPATHを変更する必要はありますか?どうして?

挨拶ユルゲン

答えて

33

TL; DR:Relative imports are gone。代わりに絶対インポートを使用してください。

のいずれかを使用:

from Phone.Pots import Pots 

か:

from .Pots import Pots 

PotsPhoneパッケージの一部であるため、問題が発生します。Potsという名前のモジュールが存在しない、Phone.Potsという名前のモジュールがあります。

Python 2にはrelative importsという機能があり、それは技術的には正しくない場合でもimport Potsと書くことができます。

相対的な輸入は、しかしproblems and confusionのソースされています

  • コードを読み取るすぐにインポートがパッケージからであるかどうかと言うことはできません。
  • モジュールの名前はPhone.Potsですが、import Potsを使用できますか?これは非常に矛盾しています。
  • サブモジュールが別のモジュールの名前をシャドーするとどうなりますか?これらの理由から

、相対的な輸入は、あなたが__future__ importを使って、Pythonの2からの相対的な輸入品を取り除くことができますPythonの3から


を削除されました。

from __future__ import absolute_import 
+0

アンドレア:ありがとうのために迅速かつ詳細な答え。 – MatrixClient