如何让 setuptools 安装不在 PyPI 上的包?

我刚开始使用 setuptools 和 viralenv。我的软件包需要只能从 GitHub 获得的最新 python-gearman。PyPI 上的 python-gearman 版本是旧版本。Github 源代码与 setuptools 兼容,例如有 setup.py 等。有没有办法让 setuptools 下载并安装新版本,而不是在 PyPI 上查找并安装旧版本?

仅供参考,新的蟒蛇齿轮人是 http://github.com/mtai/python-gearman

85610 次浏览

Vanilla setuptools不支持直接从 git 存储库下载,但是您可以使用该页面的 下载源代码链接之一,比如:

easy_install http://github.com/mtai/python-gearman/tarball/master

关键是告诉 easy _ install 软件包可以在哪里下载。在这种特殊情况下,可以在 URL http://github.com/mtai/python-gearman/tarball/master中找到它。但是,这个链接本身不会起作用,因为 easy _ install 不能仅仅通过查看 URL 就知道它将获得什么。

通过将其更改为 http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta,easy _ install 将能够识别软件包名称及其版本。

最后一步是将 URL 添加到您的软件包的依赖关系链接中,例如:

setup(
...
dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)

现在,当您的软件包被安装时,easy _ install 会发现有一个“ gearman 2.0.0 beta”可以从这个 URL 下载,如果您在依赖项中指定“ gearman > = 2.0.0 beta”,那么您可以在 PyPI 上选择它。.

(通常情况下,这种方法是在 PyPI 页面上包含一个指向可下载源代码的链接; 在这种情况下,如果 gearman 包的作者包含了上面这样的链接,那么您已经设置好了。通常,人们用‘ myproject-dev’标记开发版本,然后人们使用‘ myproject > = somever,= = dev’的要求,这样如果没有更高的包,easy _ install 就会尝试签出或下载这个版本。)

使用 pip时需要指定 --process-dependency-links。请注意,依赖链接处理已被弃用,将在以后的版本中删除。

您可以使用 pip install protocol+location[@tag][#egg=Dependency]格式使用 pip 从源代码直接安装。

饭桶

pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName

反复无常

pip install hg+https://hg.myproject.org/MyProject/

SVN

pip install svn+svn://svn.myproject.org/svn/MyProject

Bzr

pip install bzr+http://bzr.myproject.org/MyProject/trunk

支持以下协议: [+git, +svn, +hg, +bzr]

版本

@tag允许您指定要签出的特定版本/标记。

#egg=name允许您指定项目作为其他项目的依赖项。

顺序必须始终是 @tag#egg=name

私人仓库

您还可以通过将协议更改为 SSH (ssh://)并添加适当的用户(git@)来从私有存储库安装:

git+ssh://git@github.com/username/my_private_repo

您还可以使用用户名/密码从私有存储库进行安装。

git+https://<username>:<password>@github.com/<user>/<repo>.git

Github 提供了创建可循环的 个人 OAuth 令牌的能力

git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git

要求

requirements.txt用于指定项目依赖项:

要求

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

这些软件包不是自动安装的,必须使用 pip -r requirements.txt命令安装。

包括需求文件

需求文件可以包括其他需求文件:

需求-文档

sphinx
-r requirements-dev.txt

需求-dev. txt

some-dev-tool
-r requirements.txt

要求

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

Setup.py

需求文件可以使用以下命令安装 setup.py中指定的依赖项:

-e .

setup.py也可以使用与上面相同的语法从存储库安装,但是使用 这个答案中提到的 dependency_links值。

参考文献:

Https://pip.pypa.io/en/latest/user_guide.html#installing-packages Https://pip.pypa.io/en/latest/reference/pip_install.html

因为我只是做了同样的事情,我找到了另一种方法来做到这一点,因为 pip--process-dependency-links是计划在 pip19.0根据 此评论删除。

pip18.1包括以下特性

允许将 PEP 508 URL 要求用作依赖项。

从 PEP 508的 描述来看,这种 URL 依赖的语法如下:

一个最小的基于 URL 的查找:

Pip@https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686

所以在你的 setup.py

setup(
...
install_requires = [
...
'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
...
]
)

注意,该链接是一个归档文件,也可以是存储库的特定版本或分支,如 在这个答案中所述。此外,请参阅与其他存储库主机一起工作的答案。

据我所知,更新依赖项的最简单方法是在从包的目录安装包时使用 pip install -I .