pipを使用してgitサブディレクトリからインストールするにはどうすればよいですか?


107

私は多くのフォルダーを持つgitリポジトリを持っています。そのうちの1つは、次のようにpipでインストール可能なPythonモジュールです。

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

今、私はインストールするために以下をしなければなりません:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

明示的にクローンを作成せずに、pipを使用してモジュールを直接インストールすることは可能ですか?

私は試した:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

しかし、私は得ます:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'

1
この質問はすでに回答されているようです:stackoverflow.com/questions/10847764/pip-install-from-git-repo
Synthesisrpatel

1
リンクした質問は、MANIFEST.inがないためにファイルが見つからないことに関するものでした。私の質問は、pipを使用してサブディレクトリをインストールする方法についてです。リポジトリ全体のクローンを作成することでパッケージをインストールできるため、ファイルが欠落していません。
J.マルティノラガルド2012年

@synthesizerpatelあなたがリンクした質問は別のことについて尋ねますが、タイトルは誤解を招くものだったので、私はそれを修正しました。あなたはあなたの(私が推測する)反対票を取り除くことを検討することができます。
Piotr Dobrogost 2012年

回答:


125

この機能に関するプルリクエストがあり、1か月前にブランチを開発するために統合されたようです。構文はのとおりです。

pip install -e git+https://git.repo/some_repo.git#egg=version_subpkg&subdirectory=repo # install a python package from a repo subdirectory

マスターにマージされて配布されるまで、おそらくしばらく待つ必要があります。

更新:これは、https//pip.readthedocs.io/en/stable/reference/pip_install/#vcs-supportで次のように利用可能になり、文書化されています。

setup.pyがプロジェクトのルートにないプロジェクトの場合、「サブディレクトリ」コンポーネントが使用されます。「サブディレクトリ」コンポーネントの値は、プロジェクトのルートからsetup.pyが配置されている場所までのパスである必要があります。

したがって、リポジトリのレイアウトが次の場合:

- pkg_dir/
  - setup.py  # setup.py for package ``pkg``
  - some_module.py
- other_dir/
  - some_file
- some_other_file

使用する必要があります

pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir

注:Windowsでは、URLを二重引用符で囲む必要があります。そうしないと、「「サブディレクトリ」は内部コマンドまたは外部コマンドとして認識されません」というエラーが表示されます。例:使用:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"

4
確認したところ、2014年1月1日にリリースされたpip v1.5の一部です:github.com/pypa/pip/blob/develop/CHANGES.txt
tomka

20
ubuntuを使用している場合は、実際のgitの場所の前に必ず一重引用符を使用してください。使用しない場合、&subdirectoryは無視されます。例:pip install -e'git + git.repo /… '
Lin

8
ただの注意:これは、エントリポイントがサブディレクトリ内にあるパッケージでは機能しないようです(少なくともpip v1.5.6では、6つ以上のバージョンについてはわかりません)。pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'パッケージ内の結果が表示されてインストールすると、package.egg-linkファイルは、サイトのパッケージに入れて取得-それはのルートディレクトリを指すsrc/repoではないsrc/repo/package私は期待通り、。これは、py_modulesインポートできず、entry_points実際には機能しないことを意味しますImportError: No module named package。どちらも。を発生させます。
マークG.

2
-e必要なようです。そうでない場合pip freezeは、パス全体が表示されず、卵のみが表示されます。これはpip-1.5.4
次の

2
他の人へのヒント:git + httpsを使用する必要があります。git+ gitは機能せず、致命的になります:リモートエラー:リポジトリが見つかりません。おそらく、「クエリ」文字列を正しく解析しないためです。ログに記録したばかりです:github.com/pypa/pip/issues/4898
amohr

33

正解の下のコメントの1つですでに述べられていますが、この問題を強調するために:Linuxコマンドラインからこれを実行するときは、アンパサンドがコマンドラインにバックグラウンドでコマンドを実行するように指示しているため、-文字をエスケープする必要あり&ます。

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo

アンパサンドの前のバックスラッシュに注意してください。エスケープ動作はLinuxディストリビューションに依存する可能性があります。私は専門家ではありません。
これを無視すると、次のような不可解なエラーが発生する可能性があります。

bash: (...) command not found

1
URLを一重引用符で囲むと、アンパサンドをエスケープする必要がなくなりますか?これは、cURLでURLを操作するときに役立つことを知っています。
Josh Peak

1
また、これをWindowsコマンドラインから実行する場合は、URLを二重引用符で囲む必要があります。そうしないと、「「サブディレクトリ」は内部コマンドまたは外部コマンドとして認識されません」というエラーが表示されます。たとえば、pip install -e "git + myurl / proj#egg = subpkg&subdirectory = subdir "

一般に、シェルスクリプトを操作するときは、安全のために引数を二重引用符で囲みます。その他のベストプラクティスについては、shellcheck.netまたはgithub.com/koalaman/shellcheck
ErikAronesty19年

2
(これはLinuxディストリビューションの一種であるとして)エスケープは、同様にOSXに必要である
ygesher

6
ブランチベースの使用をインストールする場合:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.