1

次のようなディレクトリ構造があります。

src/
--scripts/
----foo/a.py
----bar/b.py
--lib1
--lib2
--lib3

scripts/foo/ および scripts/bar/ を、lib1、lib2、lib3 のモジュールを利用する実行可能な Python スクリプトのディレクトリにする場合の意図。スクリプト lib1、lib2、および lib3 はすべて、アクティブな開発中の個別の内部 git リポジトリです。依存する静的インターフェイスや公開バージョンはありません。基本的に、それらはすべて小さなチームによってほぼ同時に書かれています。

私は lib[1-3] サブモジュールを作成して遊んだことがありますが、ワークフローが本当に嫌いです。私が望むのは、foo/a.py から「lib1 をインポート」して、lib1 の現在のコードを使用できるようにすることです。物事が成熟したら、すべてをバージョン管理し、適切なパッケージを製品化する予定です。

これを行う 1 つの方法はsys.path、各スクリプトをいじって、'../../' などを明示的に調べることです。もっとエレガントなものはないかと思っていました。私のためpip install -r requirements.txtにこの仕事をするようなものを手に入れることができますか?公式の pypi setup.py を作成したくありません。lib[1-3] ディレクトリの現在の内容へのポインターを取得したいだけです。私が requirements.txt アプローチを気に入っている理由は、ライブラリが成熟するにつれて、そこにバージョンと git URL を配置することになるからです。

または、これを行うためのまったく異なる方法はありますか?

4

1 に答える 1

3

通常の方法でgitリポジトリからモジュールをインストールするにsetup.py. 例えば:

#!/usr/bin/env python

from distutils.core import setup

setup(
    name="foo",
)

そのようなものを各 lib リポジトリにドロップすると、-e git://git.example.com/foo.git#egg=foo. これを virtualenv にインストールするとsrc/foo、virtualenv ディレクトリ内に表示され、sys.pathその virtualenv から Python を実行すると自動的に追加されます。

この-eオプションはローカル ディレクトリもパラメーターとして受け入れるため、インストール時に現在の作業ディレクトリが常にプロジェクトのルートになることが保証されている場合requirements.txt(相対パスが正しく解決されるように)、次のように記述しても問題なく動作するはずです。-e lib1必要に応じて、ライブラリを git サブモジュールとして参照することもできます。

を作成しないと決めたsetup.py場合、タスクは を実行したときに何が起こるかをエミュレートすることpython setup.py developです。このコマンドは 2 つのことを行います (少なくとも Python 2.7 以降):

  • virtualenvのlib ディレクトリ (virtualenv がない場合はシステム全体) に、ターゲット ソース ディレクトリを指す卵リンクを作成します。site-packages
  • に行を追加します。これもディレクトリeasy-install.pthsite-packagesにあり、ターゲット ソース ディレクトリも指しています。

実行以外の方法で上記の両方のアクションを実行してsetup.py editable、現在のバージョンの Python で同じ効果を得ることができますが、もちろん、編集可能なディストリビューションの実装は、新しいバージョンの Python で変更される可能性があります。

于 2013-03-28T05:52:08.160 に答える