pip忽略setup.py中的dependency_links

时间:2012-09-20 18:17:42

标签: python pip setuptools distutils easy-install

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

6 个答案:

答案 0 :(得分:56)

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

基于@ Cerin评论的更新:

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

答案 1 :(得分:43)

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

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

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

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

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

filterM

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

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

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

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和标志process-dependency-links和allow-all-external,因此很快就会将其删除。在我花费的时间里,我无法找到一个更好的,更喜欢的方法,并且仍然有正确的pip功能。

答案 2 :(得分:13)

A couple of notes on some issues I found, in particular for installing from private repos.

Installing from pip & setuptools have some subtle differences; but this way should work for both.

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

A couple of notes here:

  • For private repos, you need to authenticate with GitHub; the simplest way I found is to create an oauth token, drop that into your environment, and then include it with the URL
  • You need to include some version number (here is 0) at the end of the link, even if there's no package on PyPI. This has to be a actual number, not a word.
  • You need to preface with git+ to tell setuptools it's to clone the repo, rather than pointing at a zip / tarball
  • version can be a branch, a tag, or a commit hash
  • You need to supply --process-dependency-links if installing from pip

答案 3 :(得分:7)

因为支持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'
    ],
)

要安装您的软件包,您只需编写以下内容:

pip install yourpackage

(没有--process-dependency-links)

答案 4 :(得分:1)

请先升级您的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 worksseemingly works but did not really pull the dependency from the specified link或简单的being rejected。因此,我可能只将其用作短时解决方法。尽可能使用主流方式。

答案 5 :(得分:0)

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

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

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

setup.py

...

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