複数の場所からモジュールをインポートしようとしていますが、Python3の相対インポートが無効になっているため、これを動作させることができません。私はこれをやりたいので、ユーザーはpackage_1をコピーして端末で実行することができます(メインクラスを使用)。別のクラスはWebアプリケーションのフロントエンドであるscriptb.pyにインポートされます。 "package_1/run.py" 輸入でここ複数の場所からモジュールをインポートするとき、python3の相対インポートが発生する
-- projectfolder
-- projectfolder/
-- __init__.py
--- package_1/
------ __init__.py
------ subpackage_a/
------ subpackage_a/core/module1.py
------ subpackage_a/__init__.py
------ subpackage_a/core/__init__.py
------ run.py
--- package_2/
----- __init__.py
-- -- scriptb.py
: package_1.runインポートクラス名
: subpackage_a.core.module1インポートクラス名からここは "package_2/scriptb" 輸入があります'package_1.core'
Traceback:
File "/directory/package_1/run.py", line 7, in <module>
from subpackage_a.common.exceptions import Classname
ImportError: No module named 'subpackage_a.common'
という名前のモジュール:私はscriptb.pyを実行すると
は、しかし、私はrun.py はImportErrorで次のエラーを取得します
これを処理し、ImportError例外をキャッチし、すべての "package_a"モジュールで2つのインポート場所を定義するより良い方法はありますか?二回
if __name__ == '__main__':
from package_1 import classname
else:
from .package_1 import classname
各モジュールをインポートすることを意味し、これを行うよりも
またはより良いおかげ
EDIT:今後の参考のため
を、私は、他のモジュールをインポートするには、サブパッケージでこれをしなければなりませんでしたコアフォルダ
try:
from package_1.core.module1 import classname:
except ImportError:
from ..core.module2 import classname
次のとおりですメインに:あなたはパッケージとしてそれを使用したい場合は
if __name__ == '__main__':
from package_1.core.module1 import classname:
except ImportError:
from .package_1.core.module2 import classname
ご返信ありがとうございます。すべてのパッケージには__init__.pyファイルがあります。 – budge
メインプログラムとして呼び出されていないので、 "私が__name__ == '__main__':"サブパッケージ内で使用することはできませんので、まだ私はポストを編集しますそれと同じ問題があります。 ImportError例外を捕まえなければならないとしましょう。 – budge