Pythonサブフォルダ輸入カオス
-
21-12-2019 - |
質問
このようなフォルダ構造があるとします。
.
├── 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
を使用します。