为啥从 git repo 进行 pip 安装时 #egg=foo

Posted

技术标签:

【中文标题】为啥从 git repo 进行 pip 安装时 #egg=foo【英文标题】:Why #egg=foo when pip-installing from git repo为什么从 git repo 进行 pip 安装时 #egg=foo 【发布时间】:2012-08-03 20:15:27 【问题描述】:

当我执行“pip install -e ...”从 git repo 安装时,我必须指定 #egg=somename 或 pip 抱怨。例如:

pip install -e git://github.com/hiidef/oauth2app.git#egg=oauth2app

这个“蛋”字串有什么意义?

【问题讨论】:

This part of the pip install documentation 谈到#egg=name,但没有给出明确的答案。 【参考方案1】:

您必须包含 #egg=Package 以便 pip 知道该 URL 会发生什么。见https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support

more on eggs

【讨论】:

这是什么意思“所以 pip 知道该网址会发生什么?”除了#egg 之外,还有什么可以附加到这样的网址的吗? 我其实很喜欢 Will 在pip install -hSource will be checked out into src/PACKAGE (lower-case) and installed in-place (using setup.py develop) 的回答我不确定它是否在其他地方使用... 已克隆但未安装:(【参考方案2】:

per pip install -h "egg" 字符串是作为安装的一部分检出的目录

【讨论】:

这可以和存储库同名吗?案例重要吗? "被检出的目录"?那么我要输入分支名称吗?编造点什么? 如果你制作了一个自定义的 Python 包,当你运行 setuptools 时,应该已经创建了一个名为 project-name.egg-info/top_level.txt 的目录。将此文件的内容用作egg 参数的值。 我似乎无法弄清楚egg=... 设置是否真的很重要。我正在安装的包在 top_level.txt 文件中有多个条目。我已经尝试将其与脚本在setup.py 中使用的name kwarg 匹配,但也是一个任意值。结果似乎都一样。请注意,我正在使用不需要-epip install https://... 语法进行安装。【参考方案3】:

https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support 说:

url后缀“egg=-”的“项目名称”组件被pip在其依赖逻辑中用来识别 pip 下载和分析元数据之前的项目。这 鸡蛋名称的可选“版本”组件在功能上不起作用 重要的。它只是提供了关于什么版本的人类可读线索 正在使用中。对于 setup.py 不在项目根目录中的项目, 使用“子目录”组件。 “子目录”组件的值 应该是从项目的根目录到 setup.py 的路径 位于。

据此我推断 egg 值仅用于依赖检查,因此我认为按照惯例,应该使用包名(即some-pypi-package-name),而不是任何包含的文件夹(即some_pypi_package_name

【讨论】:

【参考方案4】:

鸡蛋就是some bundled python code。在 git url 中,egg 是项目名称。 VCS Support

通常我们从 Pypi 安装 python 包,所以你只指定包名称和版本(或者如果你不指定,它假定最新版本)。 Pypi 然后搜索你想要的鸡蛋并 pip 安装它。 pip install celery 将安装最新发布的 egg,pip install celery[redis] 将安装包含相同 celery 包的不同 egg,并从 celery 的 setup.py 中列为 redis 依赖项的任何包中安装最新的 egg。

使用 git 和 gitlab 路径,您可以指定 /user|group/repository.git@tag#egg=package-name#egg=celery#egg=celery[redis] 之间是有区别的,但它们都来自相同的源代码。

"tag" 也可以是除了实际标签之外的分支或提交哈希。如果不指定,则假定为master

例如,git+https://github.com/celery/celery.git#egg=celery==4.3.0 会检查 master 分支并安装它。即使您指定了版本号,安装时也不会考虑它。 版本号被忽略

当通过 git 或其他 VCS url 安装时,您需要找到所需版本的标签或哈希。例如,git+https://github.com/celery/celery.git@v4.3.0#egg=celery 将签出标记为“v4.3.0”的提交,然后从该源代码安装包。假设维护者没有严重错误地标记他们的存储库,您可以获得您想要的版本。

【讨论】:

【参考方案5】:

引用the manual:

pip 查看 VCS URL 的 2 个片段:

egg:用于指定 pip 依赖项中使用的“项目名称” 解析逻辑。例如:egg=project_name

子目录:用于指定Python包的路径,当它 不在 VCS 目录的根目录中。例如:pkg_dir

【讨论】:

以上是关于为啥从 git repo 进行 pip 安装时 #egg=foo的主要内容,如果未能解决你的问题,请参考以下文章

Pip 安装并运行 git repo

从 gitosis 安装 pip

如何使用 pip 卸载 git repo?

是否可以使用 pip 安装最新的标签?

sh 从git repo安装包

使用Git bash安装YoastSEO.js github repo