619

我已经使用命令安装了一个库

pip install git+git://github.com/mozilla/elasticutils.git

它直接从 Github 存储库安装它。这工作正常,我想在我的requirements.txt. 我看过其他类似的票,但这并没有解决我的问题。如果我把类似的东西

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev

requirements.txt文件中,pip install -r requirements.txt结果如下:

Downloading/unpacking elasticutils==0.7.dev (from -r requirements.txt (line 20))
  Could not find a version that satisfies the requirement elasticutils==0.7.dev (from -r requirements.txt (line 20)) (from versions: )
No distributions matching the version for elasticutils==0.7.dev (from -r requirements.txt (line 20))

需求文件的文档没有提到使用git+git协议说明符的链接,所以可能只是不支持。

有人可以解决我的问题吗?

4

10 回答 10

700

通常你的requirements.txt文件看起来像这样:

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...

要指定 Github 存储库,您不需要package-name==约定。

下面的示例package-two使用 GitHub 存储库进行更新。@和之间的文本#表示包的细节。

指定提交哈希(41b95ec在更新的上下文中requirements.txt):

package-one==1.9.4
git+https://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1

指定分支名称 ( master):

git+https://github.com/path/to/package-two@master#egg=package-two

指定标记 ( 0.1):

git+https://github.com/path/to/package-two@0.1#egg=package-two

指定版本 ( 3.7.1):

git+https://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two

注意#egg=package-two这里不是注释,是明确说明包名

这篇博文有更多关于这个话题的讨论。

于 2016-03-14T21:17:36.730 回答
380

“可编辑”包语法可用于requirements.txt从各种VCS(git、hg、bzr、svn)导入包:

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils

此外,可以指向特定的提交:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils
于 2013-05-16T10:25:26.280 回答
199

requirements.txt自 pip 7.0 起,允许以下方式指定对 git 存储库中包的依赖项:1

[-e] git+git://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+https://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+ssh://git.myproject.org/SomeProject#egg=SomeProject
-e git+git@git.myproject.org:SomeProject#egg=SomeProject (deprecated as of Jan 2020)

对于 Github,这意味着您可以这样做(注意省略的-e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils

为什么额外的答案?
-e对其他答案中的标志有些困惑,所以这是我的澄清:

-eor--editable标志表示该软件包已安装在其中<venv path>/src/SomeProject,因此不是在深埋的<venv path>/lib/pythonX.X/site-packages/SomeProject地方,否则它将被放置在其中。2

文档

于 2015-12-29T20:01:56.520 回答
93

首先,以您知道的任何方式使用git+gitor安装。安装项目分支的git+https示例:kronokbrabeion

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion

其次,用于pip freeze > requirements.txt在您的requirements.txt. 在这种情况下,你会得到

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master

三、测试结果:

pip uninstall brabeion
pip install -r requirements.txt
于 2013-12-09T00:07:54.817 回答
20

自 pip v1.5(2014 年 1 月 1 日发布:CHANGELOG , PR)以来,您还可以指定 git repo 的子目录来包含您的模块。语法如下所示:

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

注意:作为 pip 模块作者,理想情况下,如果可以的话,您可能希望在它自己的顶级 repo 中发布您的模块。然而,此功能对于某些在子目录中包含 python 模块的预先存在的存储库很有帮助。如果它们也没有发布到 pypi,您可能会被迫以这种方式安装它们。

于 2014-10-03T07:09:14.850 回答
12

Github 的 zip 端点在我看来比使用 git 协议更可取。优点是:

  • 您不必指定#egg=<project name>
  • Git 不需要安装在你的环境中,这对于容器化环境来说很好
  • 它与pip 散列和缓存一起工作得更好
  • URL 结构更容易记住和更容易发现

您通常希望 requirements.txt 条目看起来像这样,例如没有-e前缀:

https://github.com/org/package/archive/1a58aa586efd4bca37f2cfb9d9348958986aab6c.tar.gz

从主分支安装:

https://github.com/org/package/archive/main.tar.gz

还有一个等效的.zip端点,但在评论中报告说,始终使用.tar.gz端点可以避免 unicode 包名称的问题。

于 2020-09-25T08:45:44.307 回答
11

这些答案都不适合我。唯一有效的是:

git+https://github.com/path_to_my_project.git

没有“e”,没有双“git”,也不需要以前的安装。

于 2021-03-04T23:00:16.010 回答
4

看起来这也是一种有效的格式:

gym-tictactoe @ git+https://github.com/haje01/gym-tictactoe.git@84e22fc28fe192ba0040bdd56a697f63d3d4a3d5

如果你做了一个pip install "git+https://github.com/haje01/gym-tictactoe.git",然后通过运行查看安装了什么pip freeze,你会看到以这种格式描述的包,并且可以复制并粘贴到 requirements.txt 中。

于 2021-03-03T11:47:27.033 回答
3

我发现让 pip3(v9.0.1,由 Ubuntu 18.04 的包管理器安装)来实际安装我告诉它安装的东西有点棘手。我发布此答案是为了节省遇到此问题的任何人的时间。

将其放入 requirements.txt 文件失败:

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname

“失败”是指当它从 Git 下载代码时,它最终安装了在 PyPi 上找到的代码的原始版本,而不是该分支上的 repo 中的代码。

但是,安装提交而不是分支名称有效:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname
于 2019-12-05T02:33:59.247 回答
1

对于私有存储库,我发现这两个对我来说都很好:

pip install https://${GITHUB_TOKEN}@github.com/owner/repo/archive/main.tar.gz

Wheremain.tar.gz指的main是您的仓库的分支,可以用其他分支名称替换。有关更多信息和使用更新的 Github API,请参见此处

pip install https://${GITHUB_TOKEN}@api.github.com/repos/owner/repo/tarball/master

如果您安装了 git 并且可用,那么

pip install git+https://${GITHUB_TOKEN}@github.com/owner/repo.git@main

达到同样的效果,并且它还允许通过附加@branchor@tag或来获得更大的灵活性@commit-hash。然而,这种方法实际上将 repo克隆到本地临时文件夹中,这可能需要相当长的时间。

您也可以使用 requirements.txt 中的 URL。

于 2021-11-20T21:26:44.900 回答