2

これは私のフォルダです:

/Workspace
 somefiles.py
          /foopackage
           __init__.py
           foo1.py
           foo2.py

そして_ init _ .py が含まれています

from foo1 import foo1
from foo2 import foo2

そして、foopackageをインポートしたい。私はこれを試しました:

>>>import sys
>>>sys.path.append('/home/username/Workspace')
>>>import foopackage
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/username/Workspace/foopackage/__init__.py", line 1, in <module>
    from foo1 import foo1
ImportError: No module named 'foo1'

代わりに sys.path.append('/home/username/Workspace/foopackage') を試してみましたが、問題は解決しました。

それらをインポートできるようにするには、すべてのパッケージディレクトリを sys.path リストに追加する必要がありますか?
または他の何かが間違っていますか?

4

1 に答える 1

5

Python 3 を使用している場合は、Python 2 で機能していた暗黙的な相対インポートではなく、明示的な相対インポートを使用する必要があります。foopackage__init__.pyファイルを次のように更新してみてください。

from .foo1 import foo1
from .foo2 import foo2

先頭の文字は、絶対に参照している最上位モジュールではなく、とが兄弟モジュールで.あることを Python に伝えます。別の方法は、それらへの絶対参照を使用することです。foo1foo2

from foopackage.foo1 import foo1
from foopackage.foo2 import foo2

でも個人的にはちょっとやり過ぎかな。また、将来のある時点でパッケージ名を変更した場合 (または他のパッケージのサブパッケージに移動した場合) も壊れます。

相対インポートへの変更の詳細については、PEP 328を参照してください。

于 2013-10-04T23:01:44.050 に答える