2

この(または同様の)質問はこれまで何度も聞かれましたが、私の場合、提供されたソリューションはどれも機能しませんでした。私のプロジェクト構造は次のようなものです:

| project_2
      main.py
      __init__.py
      systems.py
      | config
            __init__.py
            options.py
      | database
            __init__.py
            database.py
            entity.py
      | tests
            __init__.py
            test_systems.py
            test_options.py
            test_database.py
            test_entity.py

明らかに、テストパッケージの下にあるテストモジュール内のすべてのモジュールをインポートする必要があります。ドット構文を使用して相対インポートを試しました。

from ..systems import System
from ..config import options
from ..database.entity import Entity

ValueErrorを返します:非パッケージで相対インポートを試みます。私は、すべて(システムを含む)が独自のパッケージに含まれるパッケージ構造でそれを試しました。同じメッセージで失敗します。

本当に気になるのは、これが機能するはずだということです:PEP 328ですが、機能しません。パッケージを$PYTHONPATHに追加したり、ファイルパスからimpを使用してモジュールをロードするなどの非常識な方法を使用したりする必要はありません。

問題の一部はsystems.pyがメインパッケージに含まれている可能性があることを読みましたが、それは残りの相対インポートも機能しない理由を説明していません。

PS私は実際にそれをテストするためにPEP328から例を再作成しましたが、それは機能しません。

4

2 に答える 2

0

Pythonファイルが相対インポートを行うが、そのファイルが別のモジュールのインポートを介してモジュールとしてロードされていない場合に取得します(ただし、コマンドラインからなど)。この構造を考えると:

.
├── main.py
└── test
    ├── __init__.py
    ├── a.py
    └── b.py

main.py:

from test.a import A
print A

a.py:

from .b import B
A = B

if __name__ == '__main__':
    print A

b.py:

B = 'b'

今試してください:

python main.py

結果は

b

そして

python test/a.py

あなたが得る:

Traceback (most recent call last):
  File "test/a.py", line 1, in <module>
    from .b import B
ValueError: Attempted relative import in non-package

機能するのは次のとおりです。

python -m test.a
于 2012-05-15T07:21:26.127 に答える