如何在requirements.txt中声明一个直接的github源代码

时间:2013-05-16 10:06:42

标签: python github pip requirements.txt

我使用命令

安装了一个库
pip install git+git://github.com/mozilla/elasticutils.git

直接从Github存储库安装它。这很好,我希望在requirements.txt中有这种依赖。我查看过this之类的其他门票,但这并没有解决我的问题。如果我放了像

这样的东西
-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev
{p}在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))

documentation of the requirements file未提及使用git+git协议说明符的链接,因此可能不支持。

有没有人能解决我的问题?

9 个答案:

答案 0 :(得分:259)

可以在requirements.txt中使用

“Editable” packages syntax从各种VCS (git, hg, bzr, svn)导入包:

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

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

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

答案 1 :(得分:240)

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

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

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

以下示例使用GitHub repo更新package-two@#之间的文字表示包的具体内容。

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

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

指定分支名称(master):

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

指定标记(0.1):

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

指定发布(3.7.1):

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

请注意,此处#egg=package-two不是评论,而是explicitly state the package name

This blog post对此主题进行了更多讨论。

答案 2 :(得分:152)

从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

对于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中,否则会将其置于其中。 2

<强>文档

答案 3 :(得分:72)

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

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

答案 4 :(得分:15)

自pip v1.5(2014年1月1日发布:CHANGELOGPR)起,您还可以指定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模块作者,理想情况下,如果可以,您可能希望将模块发布到其自己的顶级仓库中。然而,此功能对于在子目录中包含python模块的一些预先存在的repos很有用。如果它们没有发布到pypi,你可能会被迫以这种方式安装它们。

答案 5 :(得分:7)

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

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

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

答案 6 :(得分:3)

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

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 中。

答案 7 :(得分:2)

Github有一个zip端点,我认为它比使用git协议更可取。优点是:

  • 您不必指定#egg=<project name>
  • 不需要在您的环境中安装Git,这对于容器化环境非常有用
  • pip hashing
  • 一起使用会更好
  • URL结构更容易记住和发现

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

https://github.com/org/package/archive/1a58aa586efd4bca37f2cfb9d9348958986aab6c.zip

要从主分支安装:

https://github.com/org/package/archive/main.zip

答案 8 :(得分:0)

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

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

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

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

但是,安装commmit而不是分支名称是可行的:

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