pip在setup.py中忽略了dependency_links。

81

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


9
似乎每个人都在说dependency_links已经被弃用,现在应该使用requirements.txt。但是如果你想让在pip安装你的repo时自动安装依赖项,那么这样做就不太好。有人知道现在应该怎么做吗?pip,你在吗? - Peter
6个回答

69

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

根据 @Cerin 的评论更新:

  • Pip 1.5.x 有一个标志以启用处理依赖链接: --process-dependency-links。我没有测试过,因为我同意下面的观点。
  • 这个讨论似乎表明使用依赖链接是不好的做法。尽管此功能已被列为弃用,但它仍然存在有效的私人包用例。

4
“--process-dependency-links”标志对我有用。在我的情况下,我还必须指定一个不在pypi上的版本名称。如果相同的版本在pypi上声明了egg名称中的“dependency_links”,pip会忽略“dependency_links”版本并从pypi获取。这是在Python 3.3.6上使用pip 6.0.8的情况。 - turtlemonvh
4
--process-dependency-links 的替代方案是什么?我正在尝试使用 pip 安装依赖于 GitHub 存储库的软件包。 - Ankur Agarwal
6
查看 https://github.com/pypa/pip/pull/1955 ,由于需要进行私有构建,因此“dependency_links”选项将继续存在。 - Doncho Gunchev
32
从pip版本18.1开始(至少如此),请使用PEP 508直接引用规范来指定依赖项,不要使用dependency_links。例如:install_requires=['python-s3 @ http://github.com/robot-republic/python-s3/tarball/master.tar.gz'] - Wolfgang Kuehn
10
@WolfgangKuehn,你应该考虑将你的评论转换为实际的答案。这是所有关于这个主题的Stack Overflow帖子中唯一帮助我的东西,而且它被埋没在评论列表中。 - andreimarinescu
显示剩余2条评论

61

自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)


4
我从 pip 19.0.3 中获得了错误信息:“无效需求,解析时出现错误:'@ https:'”。 - Jaakko
11
我不得不删除版本说明符号。为了让它起作用,我将'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 你说得对,移除 ==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 并使用了它,这不是我期望发生的事情。 - Javier Buzzi
1
跟进一下,看起来如果你使用 pip 进行安装,一切都能按预期工作。当你使用本地的 python setup.py install 或者 python setup.py develop 时,每次都会安装错误的版本。讨论可以在这里进行:https://dev59.com/7LPma4cB1Zd3GeqPvb0h - Javier Buzzi
2
这些 pep508 的 URL 只适用于源分发包,而不适用于轮子。这是故意设计的吗?还是应该被视为一个 bug?(我正在使用 setuptools 39.0.1) - jjmurre
显示剩余2条评论

47

我知道这是一个老问题,但如果您像我一样来到这里,以下是我解决这个问题的方法。

我在GitHub上有一个包(未在pypi中注册),它依赖于其他GitHub(非pypi)包。我花了很多时间试图弄清楚如何让pip正确处理这个问题。我会在这里包含我所做的事情。

将依赖关系放入requirements.txt文件是列出依赖项的首选方法。然而,您还需要在setup中填写install_requires。在这个阶段,我遇到了pip不想从GitHub安装依赖项的障碍。

大多数地方,包括对这个问题的回答,告诉你要填写setup的dependency_links部分。 然而,您还需要在install_requires字段中填写在dependency_links中引用的软件包的名称。

例如,如果您的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和flags process-dependency-links和allow-all-external已经过时,因此它们很快将被删除。在我花费的时间内,我无法找到更好、更受欢迎的方法,并且仍然可以使pip正常运行。


22
我会尽力做到最好。需要翻译的内容是:“我添加这个是因为它看起来是一个更完整的例子。不太多的地方提到依赖链接部分中的内容也必须在install_requires部分中。” - Chad
1
谢谢@chad!窍门是将版本添加到依赖项中,并将其添加到要求列表中。 - mvpasarel
需要注意的一点是,在进行此操作时版本号非常重要(而在 requirements.txt 中通常可以省略它)。 - cedd
从pip版本10.0.0b1(2018-03-31)开始,“--allow-external”已被弃用。 - Wolfgang Kuehn
1
关于首选方法的回复。来自 https://github.com/pypa/pip/issues/4187#issuecomment-415067034 :“依赖链接是setuptools特有的机制,由setuptools的内部机制处理,而不是由pip处理。因此,与直接URL链接不同,我们无法控制它们的操作。这就是为什么我们弃用它们,转而使用标准的直接URL形式,我们自己处理。” 我认为,“直接URL链接”意味着您将完整的URL(包括git+https#egg=部分)作为pip的参数使用。 - cowlinator

14

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

从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令牌(token),将其放入环境中,并随URL一起包含。
  • 即使PyPI上没有包,你也需要在链接结尾处包含某些版本号(这里是0)。这必须是一个实际的数字,而不是一个单词。
  • 你需要以git+为前缀来告诉setuptools它要克隆存储库,而不是指向zip / tarball。
  • version可以是分支、标签或提交哈希值。
  • 如果从pip安装,你需要提供--process-dependency-links

在这个问题上浪费了很多时间。感谢您的澄清。 - trianta2
那么实际上需要放在 git 仓库中的是什么?我需要一个 egg 文件吗? - 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'
]
  • 版本号使用了随机选择的"Version 1.0.0"和"bluealign-git"作为名称。
  • 版本号是必需的。
  • 我们故意使用名称"bleualign-git"来区分它与主仓库版本的不同。

希望这可以帮到您。

评论:

很好的回答(已点赞)。还要提到,实际结果可能取决于平台和/或pip版本,我见过它正常工作,或者似乎工作但并没有真正从指定链接提取依赖项,或者被拒绝。因此,我可能只会将其用作短期解决方法。尽可能使用主流方式。


奖励分数将会在您展示一个仓库名称包含连字符的情况下得到加成。 - Ryan de Kleer

0

以上的解决方案都没有在它们各自的显式形式中为我工作。我将其添加为另一种特定情况的解决方案。OP 在他们的远程 repo 中有一个 tarball,但我因为相关情况而来到这里:远程 repo 中只有源代码。

我有一个依赖项,它是 Azure DevOps 上的远程私有存储库。我想使用 pip 安装本地 python 包,并自动安装远程依赖项。远程存储库是一个带有 setup.py 和一些源代码的 python 包。该 repo 没有像 eggs/wheels/tarballs 这样的构建产物,只有 .py 文件。我能够使用 pip install git+https://... 手动安装远程依赖项,因此我正确地怀疑远程存储库不需要包含 eggs/wheels/tarballs。

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

setup.py

...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接