web-dev-qa-db-ja.com

Pythonでプロジェクト内のプロジェクトをどのように処理しますか?

これは主観的な質問の答えになる可能性があることはわかっていますが、「これを実行すればすべてがうまくいく」という形での答えは期待できません。私はおそらくいくつかの決定がなされることを知っており、異なるシナリオには異なるアプローチがより良いことを認識しています。いずれにせよ、私は専門家が実際に使用しているあらゆる戦略の長所と短所のレビューをお願いします。


BigLibraryと呼ばれる大きなライブラリーを書いていると想定します。このライブラリはいくつかの小さなプロジェクトに分割でき、その一部はBigLibraryの外部でも使用できます。スムーズなワークフローを実現するためにフォルダ構造とインストールを整理する最良の方法は何ですか?

私もgitを使用しており、複数の開発者がプロ​​ジェクトのすべての側面で作業できる必要があることを考慮してください。

私にはいくつかのオプションがあります:

オプション1

BigProject 
  __init__.py
  main_files.py
  subLibrary1
  subLibrary2

この問題は、BigLibraryを介してsubLibrary1とsubLibrary2にアクセスする必要があるため、理想的ではありません。また、subLibrary1とsubLibrary2に独自のgitリポジトリを持たせたい場合は、ワークフローがgitで複雑になります。

オプション2

BigProject
  __init__.py
Library1
Library2

これに関する問題は、手動でsys.pathに追加しない限り、BigProjectがLibrary1とLibrary2を認識しないことです。これは醜い解決策のようです。 gitですべてがうまく機能するようになりますが、名前空間を少し汚染します。

理想的には、BigProjectに影響を与えずにLibrary1とLibrary2を変更することもできます。良い瞬間だと感じたときにのみ、特定のバージョンのLibrary1とLibrary2に更新することを決定します。基本的に、BigProjectにLibrary1とLibrary2の特定のチェックアウトを使用させて、「更新」して現在のチェックアウトに持ってくるまで決定します。

8
Ant

どちらでもない。 インストールpipを介してライブラリを作成し、git submoduleを介して特定のバージョンをピン接続できるようにします。詳細に:

特定のディレクトリレイアウトでサブライブラリを分離しないでください。 sys.pathをいじらないでください。代わりに、ライブラリを個別にインストール可能にします。これはおそらく、独自のsetup.pyを備えた独立したgitリポジトリを意味します。これは初めて実行するときに混乱しますが、その後setup.pyはほとんど同じままです。一部の構成オプションは、PyPIを介してライブラリを配布する場合にのみ関連しますが、そうではありません。

これで、ライブラリをチェックアウトして、pip install path/to/libraryのようにインストールできます。しかし、どのバージョンの依存関係をインストールするかをどのように指定するのでしょうか。

解決策は、git submoduleを介して特定のバージョンを固定することです。これには、特定のバージョンのライブラリリポジトリがメインリポジトリのフォルダとして含まれます。すべてのライブラリを共通のフォルダに置くことができます。 lib/library1およびlib/library2。新しいバージョンのサブモジュールリポジトリを使用する場合は、メインリポジトリにコミットを作成する必要があるため、Gitサブモジュールに慣れるには少し時間がかかります。サブモジュールは、サブモジュールの現在のコミットハッシュを含む単一のファイルとして表示されます。

次に、ライブラリを編集可能なモジュールとしてインストールできます。 pip install -e lib/library1--editableモードは、ライブラリをインポートするときに、ライブラリのソースコードの変更を直接利用できることを意味します。その他の変更では、ライブラリの再インストールが必要になる場合があります(再インストールするときに--upgradeフラグを追加することを忘れないでください)。

メインプロジェクトのvirtualenvを作成するのが賢明です。これはリポジトリにコミットされませんが、グローバルPythonインストールの汚染を回避します。

依存関係をローカルで管理することの1つの欠点は、pipの組み込みの依存関係解決を使用できないことです。シナリオがさらに複雑になった場合は、依存関係のアップロード先となる内部PyPIミラーを用意しておくと便利です。次に、そこから依存関係を満たすようにpipに指示できます。しかし、それは開始時に多すぎる可能性があります。

推奨されるディレクトリレイアウト:

bigProject/
  lib/
    library1/
      library1/
        __init__.py
      setup.py
    library2/
      library2/
        __init__.py
      setup.py
  bigProject/
    __init__.py
  requirements.txt

Requirements.txtファイルは、pipに指示を送ることができ、サブモジュールへのパスを含みます。

コード内では、通常のライブラリと同じように、インストールされたライブラリを使用できます。

import library1
11
amon