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を変更する必要がありますか?どうして?
ユルゲンあいさつ
TL; DR:相対インポートはなくなりました 。代わりに絶対インポートを使用してください。
次のいずれかを使用します。
from Phone.Pots import Pots
または:
from .Pots import Pots
この問題は、Pots
がPhone
パッケージの一部であるために発生します。Pots
という名前のモジュールはなく、Phone.Pots
という名前のモジュールがあります。
Python 2には relative imports という機能があり、技術的に正しくなくてもimport Pots
を記述できます。
ただし、相対的なインポートは 問題と混乱 の原因です。
Phone.Pots
ですが、import Pots
を使用できますか?これは非常に矛盾しています。これらの理由により、相対的なインポートはPython 3。
__future__
import を使用して、Python 2から相対的なインポートを削除できます。
from __future__ import absolute_import