2017-08-19 10 views
0

によって検出されていない私は、空__init__.pyがあるネットワークとDTOフォルダ内の両方のこのモジュール全体が__init__.py

Root 
    --Network 
    --DTO 
     Lots of py files which contain classes. 
    Other py files in the project 

のような設定である比較的小さなPythonプログラムを持っています。

私がしたときfrom Network import DTOimport NetworkImport Network.DTO私はモジュールをまったく使用できません。デバッガは、それが完全に空であると言います。ルートには、実際に実行しているpyファイルが含まれています。

ネットワークとDTOフォルダ内の__init__.pyファイルは両方ともpycにコンパイルされますが、実際のすべてのpythonファイルはコンパイルされていません。

誰かが私が間違っていることを知っていますか?私はPythonを使用しています。にサブモジュールをインポートする必要があります。

+0

「Network.DTO import *」から試したことがありますか?そのような方法があれば教えてください。もししばしば、インポートを行った後に実際に実行しているpyファイルの中に 'sys.path'を表示するのに役立ちます。 – JacobIRR

+0

@JacobIRRこれもうまくいきません:(両方の_init__.pyのSys.pathにルートフォルダのパスが含まれています –

+0

'Root'以外のディレクトリからPythonを実行している場合は、 –

答えて

1

このため、サブモジュールをインポートする必要があります。あなたがそうであるように、多くの場合、サブモジュールごとにインポートを追加することは難しくなります。多くのサブモジュール(および一般的に)の場合は、__all__を使用します。ここで

Root/Network/DTO/__init__.pyのための例です:

__all__ = [ 
    'sample_module', 
    ... 
] 

for module in __all__: 
    __import__('DTO.%s' % module) 

今、あなたはfrom Network.DTO import sample_moduleを行うことができます。あなたの他のモジュールについても同じ考えが成り立ちます。

+0

__init__.pyで膨大な量の簿記をすることなくサブフォルダを作成することはできませんファイルが空いている場合は、フォルダ内のすべてをインポートする必要があります。 –

+0

'__all__'は、モジュール内の「public」であるモジュールに印を付けるので、プロジェクト内でのみ使用するサブモジュールはインクルードされません。どのモジュールファイルも、そのモジュールの "public"クラス/関数/変数を含める '__all__'を持つことができます。つまり、' sample_module'に 'Foo'と' Bar'クラスがあり、 '__all__ =フー、Bar] ' –

関連する問題