pip忽略setup.py中的dependency_links

sya*_*bro 61 python distutils pip setuptools easy-install

我在setup.py中有dependency_links:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...
Run Code Online (Sandbox Code Playgroud)

但它不起作用.但是install_requires工作正常.也许有另一种方法来设置setup.py所需的git repo?

Lau*_*van 60

这个答案应该有帮助.简而言之,您需要指定版本(或"dev"),#egg=python-s3因此它看起来像#egg=python-s3-1.0.0.

更新基于@ Cerin的评论:

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

  • 从pip版本18.1开始(至少)使用PEP 508直接参考规范.不要使用dependency_links.示例:`install_requires = ['python-s3 @ http://github.com/robot-republic/python-s3/tarball/master.tar.gz']` (11认同)
  • @WolfgangKuehn你应该考虑将你的评论转换成实际的答案。这是唯一帮助我摆脱这个主题的所有 SO 帖子的东西,它被埋在评论列表中。 (7认同)
  • 看看https://github.com/pypa/pip/pull/1955,dependency_links选项将继续存在,因为私有构建需要它. (6认同)
  • `--process-dependency-links`标志对我有用.在我的情况下,我还必须指定不在pypi上的版本的名称.如果相同的版本在pypi上并在`dependency_links`中的egg名称中声明,pip会忽略`dependency_links`版本并只从pypi获取.这是python 3.3.6上的pip 6.0.8. (4认同)
  • 使用--process-dependency-links的替代方法是什么?我正在尝试使用依赖于github repo的`pip`来安装repo. (4认同)

Cha*_*had 45

我意识到这是一个老问题,但是,如果你发现自己像我一样,这对我有用.

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

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

大多数地方,包括此问题的答案,都会告诉您填充设置的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
Run Code Online (Sandbox Code Playgroud)

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

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'
    ]
)
Run Code Online (Sandbox Code Playgroud)

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

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external
Run Code Online (Sandbox Code Playgroud)

你完成了它的工作!

免责声明:不推荐使用dependency_links和标志process-dependency-links和allow-all-external,因此很快就会将其删除.在我花费的时间里,我找不到更好的,更喜欢的方法,并且仍然有正确的pip功能.

  • 我添加了这个,因为它似乎是一个更完整的例子.没有太多地方提到依赖链接部分中的内容也必须在install_requires部分中. (19认同)

Eas*_*ael 24

由于支持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==1.0.0 @ https://github.com/user/archive/master.zip#egg=repo-1.0.0',
        'anotherpackage==4.2.1'
    ],
)
Run Code Online (Sandbox Code Playgroud)

要安装您的软件包,您可以简单地编写:

pip install yourpackage
Run Code Online (Sandbox Code Playgroud)

(没有--process-dependency-links)

  • 我必须删除版本说明符。我将`'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'`使其生效。 (5认同)
  • 我从pip 19.0.3`无效的要求中得到了错误,解析错误为''@ https:'“ (2认同)
  • @Jaakko 你是对的,删除 `==1.0.0` 效果很好。但问题仍然存在,我目前正在尝试覆盖当前在 pypi 中的包,当我这样做时:`validators@https://github.com/kingbuzzman/validators.git#egg=validators-0.13.0` 我得到了以下输出:https://gist.github.com/kingbuzzman/e3f39ba217e2c14a9065fb14a502b63d,它找到了 0.12.6 并使用它。不是我期望发生的事情。 (2认同)
  • 这些 pep508 url 仅适用于源发行版,不适用于轮子。这是设计使然,还是应该被视为一个错误?(我使用的是setuptools 39.0.1) (2认同)

Max*_*ian 13

关于我发现的一些问题的几点说明,特别是从私人回购安装.

从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)
        ]
Run Code Online (Sandbox Code Playgroud)

这里有几点说明:

  • 对于私人回购,您需要使用GitHub进行身份验证; 我找到的最简单的方法是创建一个oauth令牌,将其放入您的环境中,然后将其包含在URL中
  • 您需要在链接末尾包含一些版本号(此处为0),即使PyPI上没有包.这必须是实际数字,而不是单词.
  • 你需要在序言git+中告诉setuptools克隆repo,而不是指向zip/tarball
  • version 可以是分支,标记或提交哈希
  • --process-dependency-links如果从pip安装,你需要提供


Tob*_*nst 5

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

pip install pip --upgrade
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作:

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

希望这可以帮助。

评论:

好的答案(已批准)。也要提及的是,实际结果可能取决于平台和/或pip版本。我已经看到了它何时起作用,或者似乎起作用了,但是并没有真正从指定的链接中拉出依赖关系,或者只是被拒绝了。因此,我可能只将其用作短时解决方法。尽可能使用主流方式。