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

时间:2010-08-12 22:10:06

标签: python setuptools distutils pypi

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

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

4 个答案:

答案 0 :(得分:151)

关键是告诉easy_install可以下载包的位置。在这种特殊情况下,可以在网址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添加到包的dependency_links中,例如:

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

现在,当您的软件包正在安装时,easy_install将发现可以从该URL下载“gearman 2.0.0beta”,并且如果您指定“gearman> = 2.0,请高兴地通过PyPI上的那个选择它” .0beta“在您的依赖... ..

(通常,这种事情的方式是将一个PyPI页面上的链接包含在可下载源中;在这种情况下,如果gearman包的作者包含了如上所述的链接,那么你就是通常,人们使用'myproject-dev'标记开发版本,然后人们使用'myproject> = somever,== dev'的要求,这样如果没有更高或更高的包,easy_install将尝试签出或下载该版本。)

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

答案 1 :(得分:63)

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

GIT中

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提供了创建可以循环的personal OAuth tokens的能力

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

requirements.txt

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

requirements.txt

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

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

包括需求文件

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

要求-Docs.txt的

sphinx
-r requirements-dev.txt

要求-dev.txt

some-dev-tool
-r requirements.txt

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也可以使用与上述相同的语法从存储库安装,但使用this answer中提到的dependency_links值。

的参考文献:

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

答案 2 :(得分:12)

由于我不得不做同样的事情,所以我发现了另一种处理方法,因为pip的{​​{1}}计划根据{{3 }}。

--process-dependency-links 18.1包含以下功能

  

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

根据PEP 508的this comment,此类URL依赖项的语法如下:

  

基于URL的最小查找:

     

pip @ the description

所以在您的pip中,它看起来像

pip

请注意,该链接是一个存档文件,也可以是https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686中所述的特定版本或存储库分支。另外,请参见使用其他存储库主机的答案。

据我所知,更新依赖项的最简单方法是从目录中安装软件包时使用setup.py

答案 3 :(得分:6)

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

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