【问题标题】:How can I make setuptools install a package that's not on PyPI?如何让 setuptools 安装不在 PyPI 上的包?
【发布时间】:2011-03-29 04:43:21
【问题描述】:

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

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

【问题讨论】:

  • 您是否有理由尝试直接从 Git 安装 python 包,而不是从那里下载源代码并在源代码目录中使用 python setup.py install
  • 我希望我的包部署在多台机器上,并自动安装它的所有依赖项。
  • 您可以使用easy_installpip 直接从Github 安装它。但是还有另一种解决方案,你有没有考虑将包添加到 PyPI 中?
  • 既然只是为了部署,为什么不用buildout呢?它有几个现成的 Git 插件。
  • 解决方案在这里:stackoverflow.com/a/17442663/1841871

标签: python setuptools distutils pypi


【解决方案1】:

因为我只需要做同样的事情,我找到了另一种方法来做到这一点,因为 pip--process-dependency-links 计划在 pip 19.0 中根据 this comment 删除。

pip18.1 包含以下功能

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

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

基于 URL 的最小查找:

点子@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'
   ...
   ]
)

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

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

【讨论】:

  • 这是否也支持 pip install 支持的所有内容,例如 git URL、#subdirectory=... 等?或者他们是否想出了一种全新的语法,具有以不同且不兼容的方式公开的不同功能?
  • 如果您不使用 setuptools 并在命令行上手动管理依赖项,您似乎仍然必须使用@Rebs' answer 描述的方法。
  • 只是为了确认这适用于 distutils.core.setuppip 19.1.1
  • 生成的requirements.txt,但是与pip install -r requirments.txt不兼容
  • @应该看看你指的是哪个requirments.txt
【解决方案2】:

关键是告诉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 会发现有一个“gearman 2.0.0beta”可供从该 URL 下载,如果您指定“gearman>=2.0”,那么会很高兴地在 PyPI 上选择它而不是那个.0beta" 在您的依赖项中..

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

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

【讨论】:

  • 我按照你的建议做了,但是当我运行“python setup.py develop”时,它说“将dependency_links写入foo.egg-info/dependency_links.txt”,但实际上并没有下载和安装软件包。如果有帮助,我正在使用基于 setuptools 的 virtualenv。
  • 你还需要 install_requires='gearman>=2.0.0beta';你把它包括在内了吗?
  • 它对我不起作用,在 PyPI 上的现有版本上使用 beta 后缀,它仍然会从 PyPI 安装软件包,而不是在 dependency_links 中定义的软件包。如果您尝试使用 #egg=package-version 设置比 PyPI 上存在的版本更高的版本,则设置工具将报错 Could not find a version that satisfies the requirement 错误和 PyPI 上所有可用版本的列表。请注意,我正在尝试使用sdist 构建我的包,然后使用pip install http://url/to/my/generated/tar 安装它。
  • 好的,通过使用easy_install http://url/to/my/generated/tar 安装我的包,一切正常...知道为什么吗?
  • --process-dependency-links 已从 pip 19 开始删除!见:github.com/pypa/pip/issues/6162
【解决方案3】:

您可以使用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 安装。

包括需求文件

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

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 也可以使用与上述相同的语法从存储库安装,但使用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

【讨论】:

  • setup.py 可以从存储库安装。只需搜索“setup.py dependency_links”
  • @TomDotTom Derp,我什至赞成这个答案,但不知何故没有吸收它=P我会更新我的答案。感谢您指出了这一点!它会对我正在做的一些事情有所帮助。
  • dependency_links 我认为正在贬值(?)github.com/pypa/pip/issues/3939。我喜欢这个答案,并认为它更好,因为能够(在 setup.py 中):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
【解决方案4】:

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

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

【讨论】:

  • 所以,为了确保这个版本的 python-gearman 安装在我的软件包所在的任何服务器上,我必须在安装我的软件包之前手动运行 easy_install 吗?
  • 如果您使用easy_install,可以。但是,正如其他人指出的那样,您可以切换到具有更复杂的需求管理的pipbuildout。参见,例如:pip.openplans.org/#requirements-files
  • 其实不用手动运行easy_install;您可以简单地将额外链接添加到您的 setup.py。我会写一个解释细节的答案。
  • 正如我在上面的评论中提到的 setup.py 提供了 dependency_links 允许您从 gti 存储库下载
猜你喜欢
  • 2013-08-18
  • 2016-11-07
  • 2020-03-22
  • 2019-05-04
  • 2021-09-01
  • 2013-06-13
  • 2018-03-27
  • 2022-01-15
  • 2012-10-29
相关资源
最近更新 更多