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


142

我刚刚开始使用setuptools和virtualenv。我的软件包需要最新的python-gearman,该工具仅可从GitHub获得。PyPI上的python-gearman版本是一个旧版本。Github源代码与setuptools兼容,即具有setup.py等。是否可以通过一种方法来使setuptools下载并安装新版本,而不是在PyPI上寻找并安装旧版本?

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


1
您是否有理由尝试直接从Git上安装python软件包,而不是从那里下载源代码并python setup.py install在源代码目录中使用它?
安德鲁(Andrew)2010年

4
我希望将程序包部署在多台计算机上,并自动安装所有依赖项。
andrei

2
您可以直接从Github 使用easy_installpip安装它。但是还有另一种解决方案,您是否考虑过将软件包添加到PyPI?
Wolph

2
由于仅用于部署,为什么不使用buildout?它有几个现成的Git插件。
Wolph

Answers:


156

关键是告诉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添加到包的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.0beta”,则可以在PyPI上愉快地选择它。在你的依赖中..

(通常,完成此类操作的方法是在一个人的PyPI页面上包含指向可下载源的链接;在这种情况下,如果gearman软件包的作者已包含上述链接,则您已经设置好了通常,人们用'myproject-dev'标记开发版本,然后人们使用'myproject> = somever,== dev'的要求,因此,如果没有更高版本的软件包,easy_install将尝试查看或下载该版本。)

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


1
我按照您的建议做了,但是当我运行“ python setup.py development”时,它说“将dependency_links写入foo.egg-info / dependency_links.txt”,但实际上并没有下载并安装该软件包。如果有帮助,我正在使用基于setuptools的virtualenv。
andrei

15
您还需要install_requires ='gearman> = 2.0.0beta'; 你包括了吗?
PJ Eby

3
它对我不起作用,因为betaPyPI的现有版本带有后缀,它仍将安装来自PyPI的软件包,而不是中定义的软件包dependency_links。如果您尝试使用来设置比PyPI上更高的版本#egg=package-version,则安装工具将抱怨并显示Could not find a version that satisfies the requirement错误以及PyPI上所有可用版本的列表。请注意,我尝试使用构建程序包sdist,然后使用进行安装pip install http://url/to/my/generated/tar
zazabe

1
好的,通过使用安装我的软件包easy_install http://url/to/my/generated/tar,一切都可以按预期工作...为什么知道?
zazabe

3
--process-dependency-linkspip19开始已被删除!参见:github.com/pypa/pip/issues/6162-
凤凰城

67

您可以使用该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

z

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

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

requirements.txt

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

这些不是随软件包一起自动安装的,必须通过命令安装pip -r requirements.txt

包括需求文件

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

requirements-docs.txt

sphinx
-r requirements-dev.txt

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

参考文献:

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


2
setup.py可以从存储库安装。只需搜索“ setup.pydependency_links”
TomDotTom '16

1
@TomDotTom Derp,我什至赞成那个答案,但是不知何故没有吸收它= P我会更新我的答案。感谢您指出了这一点!它会帮助我做一些事情。
Rebs

尽管我认为Dependent_links已贬值(?)github.com/pypa/pip/issues/3939。我喜欢这个答案,并认为由于能够(在setup.py中)而更好:extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.19年

21

正如我刚刚做同样的事情,我发现了另一种方式来做到这一点作为pip--process-dependency-links计划在被删除pip按照19.0 此评论

pip 18.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 .从目录中安装软件包时使用。


这还支持所有pip install支持的内容,例如git URL #subdirectory=...等吗?还是他们想出了一种全新的语法,以不同且不兼容的方式公开了不同的功能?
remram

如果您不使用setuptools并在命令行上手动管理依赖项,似乎您仍然必须使用@ Rebs's answer所描述的方法。
菲尔

1
只是为了与distutils.core.setup和确认这项工作,pip 19.1.1
应该

得到的requirements.txt,但是,不兼容pip install -r requirments.txt
shouldsee

@shouldsee requirments.txt指的是什么?
菲尔

6

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

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

因此,为了确保将这个版本的python-gearman安装在要安装我的软件包的任何服务器上,我将不得不在安装我的软件包之前手动运行easy_install?
andrei

如果使用easy_install,则可以。但是,正如其他人指出的那样,您可以切换到pipbuildout具有更复杂的需求管理。例如,请参阅:pip.openplans.org/#requirements-files
Ned Deily 2010年

实际上,您不必手动运行easy_install。您只需将额外的链接添加到setup.py。我将写一个答案来解释细节。
PJ Eby 2010年

2
如我上面的评论中所述,setup.py提供了dependency_links,它使您可以从gti存储库下载
TomDotTom,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.