如何在Requirements.txt中声明直接的github源


447

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

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协议说明符的链接,因此也许只是不被支持。

有人能解决我的问题吗?

Answers:


327

“ Editable”包语法可用于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

3
我没有设法在本地签出这样的可编辑版本(可能由于语法问题),所以最终使用了git+git变体(有效)。在requirements.txt您的版本中有效,因此非常感谢您:)
Alfe

1
docs链接是不是为我工作; 我用的是旧的
osa

42
我不明白的是,显示的语法恰好符合要求,即-e之前没有软件包名称。
2013年

5
不需要添加“ -e”取决于您是否希望软件包处于可编辑模式,请参见@qff的回答。
2016年

17
它不应该是-e git+git://不是-e git://?我收到“应该是本地项目的路径,或者是以svn +,git +,hg +或bzr +开头的VCS URL”的错误消息。
布鲁斯·韦恩

422

通常,您的requirements.txt文件如下所示:

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

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

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

指定提交哈希(41b95ec在updated的上下文中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此处不是注释,而是要明确说明软件包名称

这篇博客文章对此主题进行了更多讨论。


54
在所有其他答案中,我简直不敢相信它们都没有显示出一个需求文件,其中包含混合了“正常”需求和git的git供比较。看起来像命令行(-e)选项让我大失所望。感谢您展示两者的融合,因此我可以将其放在上下文中!
亨迪

指着释放3.7.1git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two没有为我工作。对我有用的是git+git://github.com/path/to/package-two@3.7.1#egg=package-two
Jean Paul

这个答案很有帮助。一件事。这些git+git://...表示法在我的Linux机器上造成了ssh相对错误。因此,我最终将它们切换为git+https://...符号,然后它们完美地工作了。
RayLuo

174

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

对于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

文献资料


9
但是请注意,如果您忽略了该包,则-e下一个包pip freeze可能无法给出此程序包的正确结果
Maccesch 2017年

82

首先,以任何已知的方式使用git+git或安装git+https。安装项目kronok的分支的示例brabeion

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

4
pip Frozen仍然列出了我使用的封闭前版本的软件包。而不是直接的github结帐
Antoine Claval,2015年

4
您需要使用-e选项进行“点子冻结”以生成网址
Janusz Skonieczny

2
点9.0.1:no such option: -e
sds

你的意思是git+https?您在文字中git+git和代码中都说到了git+https
Antony Hatchkins

@AntonyHatchkins已修复。
osa

17

由于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模块的现有存储库很有帮助。如果它们也没有发布到pypi,则可能会被迫以这种方式安装它们。


1

我发现要获取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

您确定分支机构也位于远程吗?
阿尔夫

如果您想知道的话,它不是指向本地副本。
帐户
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.