2017-02-27 13 views
1

複数の場所からモジュールをインポートしようとしていますが、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 

答えて

1

すべてのサブディレクトリは、__init__.pyを持っている必要があります。次のファイル構造を実装してみてください。

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
-----------__init__.py********** 
------ subpackage_a/core/module1.py 
-------------------core/ 
-----------------------__init__.py********** 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

フォルダ/ subpackage_aフォルダとsubpackage_a /コアに

__init__.pyファイルを追加EDITED:私はこれを処理するあなたの方法は、より良いオプション

だと思います
if __name__ == '__main__': 
    from package_1 import classname 
else: 
    from .package_1 import classname 
+0

ご返信ありがとうございます。すべてのパッケージには__init__.pyファイルがあります。 – budge

+0

メインプログラムとして呼び出されていないので、 "私が__name__ == '__main__':"サブパッケージ内で使用することはできませんので、まだ私はポストを編集しますそれと同じ問題があります。 ImportError例外を捕まえなければならないとしましょう。 – budge

1

あなたのフォルダ構造と「サブパック"package_1/run.py"と "package_2/scriptb.py"に "kage_a"と表示されていますが、実際には "subpackage_a"は "package_1"のサブパッケージではありません。現実にあなたのプロジェクトをより良く適応させ、 "subpackage_a"を本当のパッケージにし、distutilsなどを使ってPythonにインストールできるようにします。すると、 "run.py"と "scriptb.py"のどちらも、相対的なインポートハックに戻らずにそれを使うことができます。

関連する問題