关于python:如何让setuptools安装一个不在PyPI上的软件包?

How can I make setuptools install a package that's not on PyPI?

我刚开始使用安装工具和virtualenv。我的软件包需要最新的python gearman,它只能从github获得。pypi上的python gearman版本是旧版本。Github源代码与SETUPTOOLS兼容,例如has setup.py等。有没有一种方法可以让SETUPTOOLS下载并安装新版本,而不是在pypi上查找并安装旧版本?

仅供参考,新的python gearman是http://github.com/mtai/python-gearman


关键是告诉easy-install在哪里可以下载软件包。在这种情况下,可以在url http://github.com/mtai/python-gearman/tarball/master上找到它。然而,这个链接本身是不起作用的,因为简单的安装不能仅仅通过查看URL就知道它将得到什么。

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

最后一步是将URL添加到包的依赖项链接中,例如:

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

现在,在安装软件包时,easy-install会发现有一个"gearman 2.0.0beta"可从该URL下载,如果您在依赖项中指定了"gearman>=2.0.0beta",则可以很高兴地从pypi上选择它。

(通常情况下,这种方式是在一个人的pypi页面上包含一个到可下载源的链接;在这种情况下,如果gearman包的作者包含了一个类似上述的链接,您就已经设置好了。通常,人们将开发版本标记为"myproject dev",然后使用"myproject>=somever,==dev"的要求,这样,如果没有somever或更高版本的包,轻松安装将尝试签出或下载该版本。)

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


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

吉特

1
2
3
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

水银的

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

视觉神经网络

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

比利时

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

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

版本

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

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

订单必须始终为@tag#egg=name

私有存储库

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

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

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

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

GitHub提供了创建个人OAuth令牌的能力,这些令牌可以循环使用

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

要求.txt

requirements.txt用于指定项目相关性:

要求.txt

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

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

包括需求文件

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

需求文件.txt

1
2
sphinx
-r requirements-dev.txt

需求-dev.txt

1
2
some-dev-tool
-r requirements.txt

要求.txt

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

Stuff.Py

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

1
-e .

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

参考文献:

https://pip.pypa.io/en/latest/user_guide.html安装软件包https://pip.pypa.io/en/latest/reference/pip_install.html


由于我不得不做同样的事情,我找到了另一种方法来做这件事,因为根据这条评论,pip--process-dependency-links计划在pip19.0中删除。

pip18.1包括以下功能

Allow PEP 508 URL requirements to be used as dependencies.

从PEP 508的描述来看,此类URL依赖项的语法如下:

A minimal URL based lookup:

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

所以在你的电脑里

1
2
3
4
5
6
7
8
setup(
   ...
   install_requires = [
   ...
   'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
   ...
   ]
)

注意,链接是一个存档文件,也可以是存储库的特定版本或分支,如本答案中所述。另外,请参见有关使用其他存储库主机的答案。

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


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

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