pip忽略setup.py中的dependency_links


74

我的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?


7
似乎所有人都说dependency_links过时了,您应该改用Requirements.txt。但这不好,如果您希望在通过pip安装存储库时自动安装依赖项。有人知道您现在应该做什么吗?点子在吗?
彼得·

Answers:


67

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

基于@Cerin的评论的更新:

  • Pip 1.5.x有一个用于启用依赖项链接处理的标志:--process-dependency-links。我没有测试它,因为我同意以下几点。
  • 该讨论似乎表明,对pip使用依赖关系链接是一种不良做法。尽管此功能已被弃用,但现在已不复存在。私有软件包有一个有效的用例。

4
--process-dependency-links标志为我工作。就我而言,我还必须指定不在pypi上的版本的名称。如果相同的版本在pypi上并在中的鸡蛋名称中声明,则dependency_linkspip会忽略该dependency_links版本,而只是从pypi中获取。这是python 3.3.6上的pip 6.0.8。
turtlemonvh 2015年

4
使用--process-dependency-links的替代方法是什么?我正在尝试使用pip依赖于github存储库的存储库。
Ankur Agarwal 2015年

6
查看github.com/pypa/pip/pull/1955,dependency_links选项将保留下来,因为私有构建需要它。
Doncho Gunchev 2015年

24
从pip版本18.1开始(至少),使用PEP 508直接参考规范。不要使用dependency_links。示例:install_requires=['python-s3 @ http://github.com/robot-republic/python-s3/tarball/master.tar.gz']
Wolfgang Kuehn,

6
@WolfgangKuehn,您应该考虑将您的评论转换为实际答案。这是唯一帮助我脱离该主题的所有SO帖子的东西,它被埋在评论列表中。
andreimarinescu

46

我意识到这是一个古老的问题,但是,以防万一您像我一样在这里找到自己,这就是对我有用的方法。

我在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

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

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功能。


20
我添加此内容是因为它似乎是一个更完整的示例。没有太多地方提到依赖链接部分中的内容也必须位于install_requires部分中。
乍得

谢谢@chad!诀窍是将版本添加到依赖项,并将其也添加到需求列表。
mvpasarel

要注意的一件事是,执行此操作时,版本号是必不可少的(而您通常可以在requirements.txt中省略)
转让

自pip版本10.0.0b1(2018-03-31)起--allow-external已弃用。
沃尔夫冈·库恩

回复:首选方法。来自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的参数。
Cowlinator '19

45

由于支持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)


3
我从pip 19.0.3Invalid requirement, parse error at "'@ https:'"
Jaakko

8
我必须删除版本说明符。我进行了更改'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

2
@Jaakko youre对,删除==1.0.0很棒的作品。但是问题仍然存在,当我这样做时,我目前正在尝试覆盖当前在pypi中的软件包:validators@https://github.com/kingbuzzman/validators.git#egg=validators-0.13.0我得到以下输出:gist.github.com/kingbuzzman/e3f39ba217e2c14a9065fb14a502b63d并找到0.12.6并使用了它。不是我所期望的发生。
哈维尔·巴齐

1
进行跟进,就像您用于pip安装一样,一切都会按预期进行。当您使用本机python setup.py installpython setup.py develop它每次安装错误的版本时。可以在此处进行讨论:stackoverflow.com/questions/56046146/…–
哈维尔·巴齐

1
这些pep508网址仅适用于源dist,不适用于车轮。这是设计使然,还是应该将其视为错误?(我正在使用setuptools 39.0.1)
jjmurre19年

12

我发现了一些有关一些问题的注释,特别是关于从私人仓库安装的问题。

从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中
  • 即使PyPI上没有软件包,您也需要在链接末尾包含一些版本号(此处是0)。这必须是实际数字,而不是单词。
  • 您需要以git+序号告诉setuptools它是克隆存储库,而不是指向zip / tarball
  • version 可以是分支,标签或提交哈希
  • --process-dependency-links如果从pip安装,则需要提供

在这个上烧了很多时间。感谢您的澄清
trianta2

那么git repo中实际需要什么呢?我需要一个鸡蛋锉吗?
mdornfe1

1
@ mdornfe1与正常版本没有什么不同-标准setup.py文件
Maximilian

10

首先升级您的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版本。我已经看到它何时起作用,或者看起来起作用,但是并没有真正从指定链接中拉出依赖关系,或者只是被拒绝了。因此,我可能只将其用作短时解决方法。尽可能使用主流方式。


奖励点,用于说明回购名称包含连字符的情况。
瑞安·德克莱尔

0

上述解决方案均不适用于它们各自的显式形式。我将其添加为某些特定情况的另一种解决方案。OP在他们的远程仓库中有一个压缩包,但我在这里遇到了一个相关案例:远程仓库中只有源代码。

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

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

setup.py

...

install_requires=["packagename @ git+https://dev.azure.com/.../_git/packagename"]
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.