質問

このようなフォルダ構造があるとします。

.
├── A
│   ├── a.py
│   └── b.py
└── main.py
.

ファイルには次の内容があります。

b字:

class BClass:
    pass
.

appy:

from b import BClass
.

main.py:

from A import a
.

python3.3 A/a.pyまたはpython3.3 B/b.byを実行すると、エラーはありません。ただし、python3.3 main.pyを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from A import a
  File "/tmp/python_imports/A/a.py", line 1, in <module>
    from b import BClass
ImportError: No module named 'b'
.

A.Pyのインポートラインをimport A.bに変更するが、明らかにpython3.3 A/a.pyが失敗します。私は実際にはpython3.3 A/a.pyを実行することに興味がありませんが、モジュールを複数の場所からインポートできるようにします。したがって、A.Pyが輸入されている場所に関係なく、A.Pyをインポートする必要があります。

この問題はどのように解決されることができますか?

役に立ちましたか?

解決

パッケージに必須である私のコメントに記載されている__init__.py以外に、兄弟モジュールを比較的インポートする必要があります。

from .b import BClass
.

それはPython 3でも機能します。

またはもちろんフルネームをインポートすることができます。

from A.b import BClass
.

しかし、あなたのモジュールはあなたのパッケージツリー内で簡単に再配置可能ではありません。

どちらの方法でも、a.pyをスタンドアロンとして使用することができます。これを実現するには、import / tryを使用してexceptステートメントを囲む必要があり、最初の1つが失敗した場合に別のバージョンを試してください。

try:
  from .b import BClass
except ValueError:
  from b import BClass
.

しかしそれは理解できます。より大きなシステムでは、モジュールはパッケージ内の他のモジュール に依存するかもしれません、そうでなければそれらはパッケージの一部ではなくスタンドアロンであるべきではありません。そして、そのような依存関係がある場合は、もちろんスタンドアロンだったかのようにモジュールを使って問題になります。

他のヒント

__init__.pyディレクトリには、Aファイル(空になるだけです)が必要です。それ以外の場合、Pythonはパッケージとして認識しません。

あなたはA aです。絶対インポートまたは明示的な相対インポートを使用する必要があります。この場合、A/a.pyでは、from A.b import BClassまたはfrom .b import BClassを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top