如何在直接github源requirements.txt状态

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

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协议说明符的链接,所以可能只是不支持。

有人有办法解决我的问题吗?

342230 次浏览

包语法可编辑可以在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

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

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

其次,使用pip freeze > requirements.txtrequirements.txt中获得正确的东西。在这种情况下,您将获得

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

第三,测试结果:

pip uninstall brabeion
pip install -r requirements.txt

自pipv1.5(2014年1月1日发布:CHANGELOG公关)以来,您还可以指定git存储库的子目录来包含您的模块。语法如下所示:

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模块作者,理想情况下,如果可以,你可能希望将模块发布在它自己的顶级仓库中。然而,此功能对于一些在子目录中包含python模块的预先存在的仓库很有帮助。如果它们没有发布到pypi,你可能会被迫以这种方式安装它们。

从pip 7.0开始,requirements.txt允许以下方式指定对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标志感到有些困惑,所以这是我的澄清:

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

需求文档

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

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

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

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

指定提交哈希(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在这里不是注释,而是显式声明包名

这篇博客文章对这个话题有更多的讨论。

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

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

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

通过“失败”,我的意思是当它从Git下载代码时,它最终安装了PyPi上的原始版本的代码,而不是该分支上存储库中的代码。

但是,安装提交而不是分支名称可以工作:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname

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

  • 您不必指定#egg=<project name>
  • Git不需要安装在您的环境中,这对于容器化环境来说很好
  • 它与点散列和缓存一起工作得更好
  • 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包名称的问题。

这似乎也是一种有效的格式:

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.

这些答案对我都不管用。唯一管用的是:

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

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

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

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

其中main.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

实现了相同的效果,并且还通过附加@branch@tag@commit-hash来提供更大的灵活性。然而,这种方法实际上将克隆存储库添加到本地临时文件夹中,这可能会花费大量时间。

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