【问题标题】:pip ignores dependency_links in setup.pypip 忽略 setup.py 中的dependency_links
【发布时间】:2012-09-13 03:59:13
【问题描述】:

我的 setup.py 中有 dependency_links:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...

但它不起作用。但是 install_requires 工作正常。 也许还有另一种方法可以根据 setup.py 的要求设置 git repo?

【问题讨论】:

  • 似乎每个人都在说dependency_links 已被弃用,您应该使用 requirements.txt 代替。但是,如果您希望在 pip-install 存储库时自动安装依赖项,这并不好。有谁知道你现在应该做什么?点子你在吗?

标签: python pip setuptools distutils easy-install


【解决方案1】:

This answer 应该会有所帮助。简而言之,您需要为#egg=python-s3 指定版本(或“dev”),使其看起来像#egg=python-s3-1.0.0

基于@Cerin 评论的更新:

  • Pip 1.5.x 有一个启用依赖链接处理的标志:--process-dependency-links。我没有测试它,因为我同意下面的观点。
  • This discussion 似乎表明对 pip 使用依赖链接是一种不好的做法。尽管此功能已被弃用,但现在不再适用。私有包有一个有效的用例。

【讨论】:

  • --process-dependency-links 标志对我有用。就我而言,我还必须指定不在 pypi 上的版本的名称。如果相同版本在 pypi 上并在 dependency_links 中的 egg 名称中声明,则 pip 将忽略 dependency_links 版本并仅从 pypi 获取。这是 python 3.3.6 上的 pip 6.0.8。
  • 使用 --process-dependency-links 的替代方法是什么?我正在尝试使用 pip 安装依赖于 github 存储库的存储库。
  • 查看github.com/pypa/pip/pull/1955,dependency_links 选项将继续存在,因为私有构建需要它。
  • 从 pip 版本 18.1 开始(至少)使用 PEP 508 直接参考规范。不要使用dependency_links。示例:install_requires=['python-s3 @ http://github.com/robot-republic/python-s3/tarball/master.tar.gz']
  • @WolfgangKuehn 您应该考虑将您的评论转换为实际答案。这是所有关于这个主题的 SO 帖子中唯一帮助我的东西,它被隐藏在 cmets 列表中。
【解决方案2】:

因为支持 pip 版本 18.1 PEP 508 URL。这意味着您不再需要已弃用的dependency_links。 您可以直接在 install_requires 列表中编写依赖项。 @Chad 的示例如下所示:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo @ https://github.com/user/archive/master.zip#egg=repo-1.0.0',
        'anotherpackage==4.2.1'
    ],
)

要安装你的包,你可以简单地写:

pip install yourpackage

(没有--process-dependency-links)

【讨论】:

  • 我从 pip 19.0.3 Invalid requirement, parse error at "'@ https:'"得到错误
  • 我不得不删除版本说明符。我将'repo==1.0.0 @ https://github.com/user/archive/master.zip#egg=repo-1.0.0' 更改为'repo @ https://github.com/user/archive/master.zip#egg=repo-1.0.0' 以使其正常工作。
  • @Jaakko 你说得对,删除==1.0.0 效果很好。但是问题仍然存在,我目前正在尝试覆盖当前在 pypi 中的包,当我这样做时:validators@https://github.com/kingbuzzman/validators.git#egg=validators-0.13.0 我得到以下输出:gist.github.com/kingbuzzman/e3f39ba217e2c14a9065fb14a502b63d 它正在寻找 0.12.6 并改用它。不是我所期望的。
  • 跟进,看起来如果你使用pip安装,一切正常。当您使用本机 python setup.py installpython setup.py develop 时,它每次都会安装错误的版本。可以在此处进行讨论:stackoverflow.com/questions/56046146/…
  • 这些 pep508 url 仅适用于源 dist,不适用于轮子。这是设计使然,还是应该将其视为错误? (我使用的是 setuptools 39.0.1)
【解决方案3】:

我知道这是一个老问题,但是,万一你发现自己像我一样在这里,这对我有用。

我在 GitHub 上有一个包(未向 pypi 注册),它依赖于其他 GitHub(非 pypi)包。我花了很多时间试图弄清楚如何让 pip 正确处理这个问题。我将在此处包含我为修复它所做的工作。

将依赖项放在 requirements.txt 文件中是列出依赖项的首选方法。但是,您还需要在安装程序中填充 install_requires。正是在这个阶段,我遇到了 pip 不想从 GitHub 安装依赖项的障碍。

大多数地方,包括这个问题的答案,都会告诉您填充 setup 的 dependency_links 部分。 但是,您还需要使用 dependency_links 中引用的包的名称填充 install_requires 字段。

例如,如果您的 requirements.txt 包含以下内容。

somepackage==1.2.0
https://github.com/user/repo/tarball/master#egg=repo-1.0.0
anotherpackage==4.2.1

然后,您的 setup 调用应如下所示:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0',
        'anotherpackage==4.2.1'
    ],
    dependency_links=[
        'https://github.com/user/repo/tarball/master#egg=repo-1.0.0'
    ]
)

好的,现在我们已经配置好了我们的包;安装它是下一个任务。这是我花了很多时间的地方。我不明白为什么指定dependency_links 显然什么也没做。诀窍是,在某些情况下,您需要为 pip 设置 allow-all-external(可以更具体)标志。例如:

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external

大功告成!

免责声明:dependency_links 和标志 process-dependency-links 和 allow-all-external 已弃用,因此它们将很快被删除。在我花费的时间里,我找不到更好的首选方法并且仍然可以正常使用 pip 功能。

【讨论】:

  • 我添加了这个,因为它似乎是一个更完整的例子。没有太多地方提到依赖链接部分中的内容也必须在 install_requires 部分中。
  • 谢谢@chad!诀窍是向依赖项添加一个版本+将它也添加到需求列表中。
  • 需要注意的是,版本号在执行此操作时是必不可少的(而您通常可以在 requirements.txt 中省略)
  • 自 pip 版本 10.0.0b1 (2018-03-31) 起,--allow-external 已弃用。
  • re:首选方法。来自github.com/pypa/pip/issues/4187#issuecomment-415067034Dependency links are a setuptools-specific mechanism, and are processed by setuptools' internal machinery, not by pip. So unlike direct URL links, we don't have any control over what they do. That's why we deprecated them in favour of the standard direct URL form, which we do handle ourselves. 我相信“直接 URL 链接”意味着您使用完整的 url(包括 git+https#egg= 位)作为 pip 的参数。
【解决方案4】:

关于我发现的一些问题的几点说明,特别是从私人存储库安装的问题。

从 pip 和 setuptools 安装有一些细微的差别;但这种方式应该适用于两者。

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

这里有几点说明:

  • 对于私有仓库,您需要通过 GitHub 进行身份验证;我发现最简单的方法是创建一个 oauth 令牌,将其放入您的环境中,然后将其包含在 URL 中
  • 您需要在链接末尾包含 一些 版本号(这里是 0),即使 PyPI 上没有包。这必须是一个实际的数字,而不是一个字。
  • 您需要在前面加上 git+ 来告诉 setuptools 它是克隆 repo,而不是指向 zip / tarball
  • version 可以是分支、标签或提交哈希
  • 如果从 pip 安装,您需要提供 --process-dependency-links

【讨论】:

  • 在这个上花了很多时间。感谢您的澄清
  • 那么 git repo 中实际需要什么?我需要一个 egg 文件吗?
  • @mdornfe1 与正常没有区别 - 标准 setup.py 文件
【解决方案5】:

首先升级您的 pip 版本,因为这是一种新语法。

pip install pip --upgrade

然后执行以下操作:

install_requires=[
    'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.zip#egg=bleualign-git-1.0.0'
]
  • 版本 1.0.0 和名称“bluealign-git”是随机选择的。
  • 版本号是必须的。
  • 我们建议使用名称“bleualign-git”来将其与主存储库版本区分开来。

希望这会有所帮助。

评论:

好的答案(赞成)。还想提一下,实际结果可能取决于平台和/或 pip 版本。我见过when it works,或seemingly works but did not really pull the dependency from the specified link,或只是being rejected。因此,我可能只会将此用作短期解决方法。尽可能坚持主流方式。

【讨论】:

  • 演示回购名称包含连字符的情况的奖励积分。
【解决方案6】:

以上解决方案都没有以各自的明确形式对我有用。我将此添加为某些特定情况的另一种解决方案。 OP 在他们的远程仓库中有一个 tarball,但我在这里遇到了一个相关的案例:只有远程仓库中的源代码。

我有一个依赖项,它是 Azure DevOps 上的远程私有存储库。我想使用pip 来安装本地python 包并自动安装远程依赖项。远程存储库是一个带有setup.py 和一些源代码的python 包。回购没有像鸡蛋/轮子/tarballs这样的构建工件,只有.py文件。我可以使用pip install git+https://... 手动安装远程依赖项,因此我正确地怀疑远程存储库不需要 包含鸡蛋/轮子/tarball。

这是我的setup.py文件的相关行

setup.py

...

install_requires=["packagename @ git+https://dev.azure.com/.../_git/packagename"]

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 2018-11-03
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多