web-dev-qa-db-ja.com

python3:ImportError:xxxxというモジュールはありません

Pythonが初めてで、パッケージを作成するときに見られる問題を理解しようとしています。次のファイル構造があります:(Working-Directoryは/ my/Python/jmLib2です)

/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()

私が今やるとき:

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

素晴らしい...しかし、もし私が:

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'

EclipseでPyDevを使用しています。 PyDevはinit。pyファイル内で「未解決のインポート:ポット」エラーを報告します。 PyDevとbashで同じトレースバックの問題があります。

繰り返しになりますが、私はPythonを初めて使用しています。しかし、python2とpython3.4の違いを誰かが説明できますか? PYTHONPATHを変更する必要がありますか?どうして?

ユルゲンあいさつ

31
MatrixClient

TL; DR:相対インポートはなくなりました 。代わりに絶対インポートを使用してください。

次のいずれかを使用します。

from Phone.Pots import Pots

または:

from .Pots import Pots

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

Python 2には relative imports という機能があり、技術的に正しくなくてもimport Potsを記述できます。

ただし、相対的なインポートは 問題と混乱 の原因です。

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

これらの理由により、相対的なインポートはPython 3。


__future__ import を使用して、Python 2から相対的なインポートを削除できます。

from __future__ import absolute_import
45