2017-09-12 17 views
0

私はたいていコンポーザーの後で特別にクラスをインポートすることができたPHPに取り組んでいました。しかし、Pythonプロジェクトで同じディレクトリ構造を適用するのは難しい時代です。プロジェクトファイルをPythonでインポートする

私は以下のディレクトリ構造を持っています。

backend commands indices.py backup.py etc.py components mapping product.py storage Es.py interfaces StorageInterface.py IndexInterface.py

マイコマンドフォルダは、基本的構成要素として、実際のビジネスロジックとのインタフェースがちょうどコンポーネントのいろはを含んで開催されます、私は、CLIを介して実行するファイルです。

同じフォルダからいくつかのコードをいくつかインポートしなければならないことがあります。時にはサブフォルダと同じレベルの別のフォルダからインポートすることがあります。例えば

私indices.pyファイルに私はこのインポートを持っている。これは、私に

[email protected]:/backend/commands# python indices.py --help 
Traceback (most recent call last): 
File "indices.py", line 1, in <module> from components.storage.Es import Es ImportError: No module named components.storage.Es 

を与える

from components.storage.Es import Es 

私はSOの他の回答を経てパッティングのsysの本当に汚い解決策を見出し、実行時にファイルを追加することができます。これは、1 2ファイルがプロジェクト全体を管理することが本当に悪いように見えても問題ありません。

ここでの私の質問は

1です - 私は、プロジェクト 2を管理するためのニシキヘビ方法以下アム - あなたが必要とどのように私はきちんとした方法で、すべての私のクラスファイルにアクセスすることができます

おかげ

+0

陰性マーカーの場合。私は何かを学ぶことができる限り私は気にしない。 –

答えて

1

backendフォルダ全体をパッケージのように扱います。従来のPython(Python 2)を使用している場合は、__init__.pyファイルをすべてのフォルダに入れて、サブパッケージとしてインポートできるようにする必要があります。輸入品を調整してfrom backend.components.storage.Es、またはfrom ..components.storage.Es(相対輸入)にする必要があります。

それで、それはすべてパッケージなので、あなたはサブフォルダに入り、コードを実行することができません。この修正は、-mモジュールフラグpython -m backend.commands.backupを使用してbackendを含むフォルダからコード(例:backend/commands/backup.py)を実行することです。必要に応じて、後でsetup.pyにすることでエントリポイントを追加して、よりきれいなコマンドにすることができます。

+0

私は '' 'backend''フォルダ内に' 'src''フォルダを作成し、私のすべてのモジュールに' '' '__init __。py'''を追加しました。これで '' 'python -m src.commands.indices'''のようなバックエンドフォルダからコマンドを実行できます。ここまでは順調ですね。ちょうどこれがpython cliプロジェクトを扱う業界標準であることを確認したかったのですか? –

1

__init__.pyのファイルは、commandscomponentsmappingstorage、およびinterfacesサブディレクトリにあり、これらのディレクトリとその中に含まれるファイルはpythonによってモジュールとみなされます。また、それらの内部で定義されているいくつかのクラスと同じ名前を持つ個々のモジュールを持つことは、実際にはpythonicではありません。たとえば、interfacesモジュールをinterfaces.pyファイルで定義し、両方のインターフェイスクラスを含むファイルをStorageInterface.pyIndexInterface.pyという名前の2つのファイルよりも優れている方がよいでしょう(私はあなたがそこでやっていると仮定しています)。

また、どのディレクトリからPythonプロセスを開始するかが重要です。そのインポートパスを意味のあるものにするために、私はあなたがbackendディレクトリからpythonプロセスを開始する必要があると確信しています。あるいは、componentscommandsなどのサブディレクトリのファイルシステムパスを、pythonのモジュールパスにPYTHONPATHのenv varまたはその他の方法で追加する必要があります。

関連する問題