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

Alf*_*lfe 377 python pip github requirements.txt

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

pip install git+git://github.com/mozilla/elasticutils.git
Run Code Online (Sandbox Code Playgroud)

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

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

需求文件文档没有提到使用git+git协议说明符的链接,因此可能不支持.

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

YPC*_*ble 320

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

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...
Run Code Online (Sandbox Code Playgroud)

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

下面的示例package-two使用GitHub仓库进行更新.@和之间的文本#表示包的具体内容.

指定提交哈希(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
Run Code Online (Sandbox Code Playgroud)

指定分支名称(master):

git+git://github.com/path/to/package-two@master#egg=package-two
Run Code Online (Sandbox Code Playgroud)

指定tag(0.1):

git+git://github.com/path/to/package-two@0.1#egg=package-two
Run Code Online (Sandbox Code Playgroud)

指定release(3.7.1):

git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two
Run Code Online (Sandbox Code Playgroud)

请注意,#egg=package-two此处不是注释,而是显式声明包名称

这篇博文有关于该主题的更多讨论.

  • 在所有其他答案中,我无法相信*没有*他们只是显示了一个需求文件,其中混合了"正常"的reqs和一个git,用于比较.看起来像命令行(`-e`)选项,我被抛弃了.感谢您展示两者的混合,所以我可以把它放在上下文中! (33认同)
  • [GitHub 放弃了对 git 协议的支持](https://github.blog/2021-09-01-improving-git-protocol-security-github/)——您必须使用 https。 (9认同)
  • 这个答案非常有帮助。不过有一件事。这些 `git+git://...` 符号以某种方式在我的 Linux 机器上导致了 ssh 相关错误。所以我最终将它们切换为“git+https://...”符号,然后它们就完美地工作了。 (7认同)
  • 使用“git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two”指向版本“3.7.1”对我来说不起作用。对我有用的是“git+git://github.com/path/to/package-two@3.7.1#egg=package-two”。 (3认同)
  • 我不确定你是否应该为 `egg=<package name>` 添加什么。我分叉了一个项目,其中“pip install”的包名称中有一个破折号(“package-two”),但您导入的模块中有一个下划线(“package_two”)。我使用了导入模块的名称(带下划线),它工作正常。 (2认同)
  • 我想你可能还需要`setup.py`或`pyproject.toml`。 (2认同)

sta*_*alk 286

"Editable"包语法可用于requirements.txt从各种VCS(git,hg,bzr,svn)导入包:

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils
Run Code Online (Sandbox Code Playgroud)

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

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils
Run Code Online (Sandbox Code Playgroud)

  • 我不明白的是,语法显示的正是要求,即-e之前没有包名. (39认同)
  • 不应该是**-e git + git://`**而不是`-e git://`?我得到一个*"应该是一个本地项目的路径或一个以svn +,git +,hg +或bzr +"*错误消息开头的VCS URL. (16认同)
  • 根据您是否希望包处于可编辑模式,不需要添加"-e",请参阅@qff的回答. (5认同)
  • 我没有设法在本地签出这样一个可编辑的版本(由于语法问题,可能),所以最终使用`git + git`变体(有效).在`requirements.txt`你的版本工作,所以非常感谢你:) (3认同)
  • 我得到这个`无法检测需求名称,请用#egg=`指定一个 (2认同)

qff*_*qff 163

requirements.txt从pip 7.0:1开始,允许以下方式指定git存储库中包的依赖性

[-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
Run Code Online (Sandbox Code Playgroud)

对于Github,这意味着你可以做(​​注意省略-e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils
Run Code Online (Sandbox Code Playgroud)

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

-e--editable标志表示该包是安装在<venv path>/src/SomeProject并因此没有在深埋<venv path>/lib/pythonX.X/site-packages/SomeProject它否则将被放置英寸2

文档

  • 但请注意,如果省略`-e`,则下一个'pip freeze`可能无法为此包提供正确的结果 (8认同)
  • 注意:自 [2020 年 1 月](https://github.com/pypa/pip/pull/) 起,`git+git@` url [已弃用](https://github.com/pypa/pip/issues/7554) 7543)。其他的还是支持的。 (4认同)

osa*_*osa 74

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

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion
Run Code Online (Sandbox Code Playgroud)

其次,用来pip freeze > requirements.txt在你的身上找到正确的东西requirements.txt.在这种情况下,你会得到

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master
Run Code Online (Sandbox Code Playgroud)

三,测试结果:

pip uninstall brabeion
pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

  • pip freeze仍然列出我用作封闭的前一版本的软件包.而不是直接github结帐 (4认同)
  • 你需要使用'-e'选项'pip freeze'来生成一个url (4认同)
  • 点9.0.1:`没有这样的选择:-e` (2认同)

Tri*_*onX 16

自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
Run Code Online (Sandbox Code Playgroud)

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


Dus*_*els 8

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

gym-tictactoe @ git+https://github.com/haje01/gym-tictactoe.git@84e22fc28fe192ba0040bdd56a697f63d3d4a3d5
Run Code Online (Sandbox Code Playgroud)

如果您执行pip install "git+https://github.com/haje01/gym-tictactoe.git",然后查看通过运行安装的内容pip freeze,您将看到以此格式描述的包,并且可以将其复制并粘贴到requirements.txt中。


Cyb*_*tic 7

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

git+https://github.com/path_to_my_project.git
Run Code Online (Sandbox Code Playgroud)

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


Thr*_*unt 5

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

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

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname
Run Code Online (Sandbox Code Playgroud)

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

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

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname
Run Code Online (Sandbox Code Playgroud)


ant*_*tam 5

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

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

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

https://github.com/org/package/archive/1a58aa586efd4bca37f2cfb9d9348958986aab6c.zip
Run Code Online (Sandbox Code Playgroud)

从主分支安装:

https://github.com/org/package/archive/main.zip
Run Code Online (Sandbox Code Playgroud)

  • 正如这个类似的 [SO 答案](/sf/answers/1736804331/) 的评论中提到的,zip 提取器可能存在 unicode 包名称问题。指定“.tar.gz”而不是“.zip”将解决此问题。 (4认同)