PyPI install_requires 直接链接

Posted

技术标签:

【中文标题】PyPI install_requires 直接链接【英文标题】:PyPI install_requires direct links 【发布时间】:2021-09-05 11:21:25 【问题描述】:

我有一个要在 PyPI 上发布的 Python 库 (https://github.com/jcrozum/PyStableMotifs)。它依赖于我无法控制的另一个库 (https://github.com/hklarner/PyBoolNet),它仅在 GitHub 上可用,特别是在 PyPI 上不可用。我的 setup.py 看起来像这样:

from setuptools import
setup(
    ... <other metadata> ...,
    install_requires=[
    'PyBoolNet @ git+https://github.com/hklarner/PyBoolNet@2.3.0',
    ... <other packages> ...
    ]
)

运行 pip install git+https://github.com/jcrozum/PyStableMotifs 运行良好,但由于 twine 出现以下错误,我无法将其上传到 PyPI:

Invalid value for requires_dist. Error: Can't have direct dependency: 'PyBoolNet @ git+https://github.com/hklarner/PyBoolNet@2.3.0'

我的理解是,出于安全原因,PyPI 禁止直接链接。尽管如此,PyBoolNet 是 PyStableMotifs 的硬性要求。我该怎么办?放弃 PyPI?

我只想让pip install PyStableMotifs 为我的用户工作。理想情况下,这个命令应该安装依赖项,我不应该维护两个版本的 setup.py。

如果做不到这一点,我考虑在 PyPI 上创建一个“虚拟”包,指导用户使用命令 pip install git+https://github.com/jcrozum/PyStableMotifs 进行安装。这是一个坏主意(甚至可能)吗?

是否已有针对这种情况的最佳实践或其他常见的解决方法?

编辑: 目前,我有一个笨重且完全不令人满意的解决方法。我保留了两个版本;一个完美运行的 GitHub 版本,以及一个删除了 PyBoolNet 要求的 PyPI 版本。如果用户尝试在未安装 PyBoolNet 的情况下导入 PyStableMotifs,则会显示一条错误消息,其中包含 PyBoolNet 的安装说明。这在我看来远非理想,但在我找到更好的解决方案或 PyPI 修复此错误(或删除此功能,具体取决于您询问的对象)之前,必须这样做。

【问题讨论】:

您需要以某种方式在索引上获取PyBoolNet,不一定是在 PyPI 上,但如果最终用户也依赖于 PyPI,那当然会更容易。 为什么会有帮助?我的意思是,显然如果它在 PyPI 上就没有问题,但如果它在其他索引上,PyPI 不会像它阻止 github 一样阻止它吗? 【参考方案1】:

我的建议是去掉 install_requires 中的直接 URL,并告诉您的用户在哪里可以找到该依赖项 PyBoolNet,因为它不在 PyPI 上.不要强迫他们使用特定的安装方法,而是向他们展示一个示例。

也许只是告诉您的用户:

此项目依赖于 PyBoolNet,而 PyPI 上没有。您可以在以下位置找到它:https://github.com/hklarner/PyBoolNet

安装 PyStableMotifs 及其依赖项PyBoolNet 的一种方法是运行以下命令:

python -m pip install 'git+https://github.com/hklarner/PyBoolNet@2.3.0#egg=PyBoolNet' PyStableMotifs

您还可以准备一个requirements.txt 文件并告诉您的用户:

使用以下命令安装:

python -m pip install --requirement https://raw.githubusercontent.com/jcrozum/PyStableMotifs/master/requirements.txt

requirements.txt 的内容可能类似于:

git+https://github.com/hklarner/PyBoolNet@2.3.0#egg=PyBoolNet
PyStableMotifs

但最后,您应该真正让您的用户选择如何安装该依赖项。您的项目只需要声明它依赖于该库,而不需要声明如何安装它。

【讨论】:

这行得通,这基本上就是我现在正在做的事情,但它打败了我将包放在 PyPI 上的#1 原因:无需查找任何内容即可轻松安装。不过,我认为没有理由让用户选择如何安装 PyBoolNet。只有一种受支持的安装方法。此外,使用 pip 的 --no-deps 选项已经可以进行这种选择,对吧? 同意,这不利于用户体验。据我所知,真的没有简单的出路。 -- 你可以考虑自己在 PyPI 上发布。我不知道该库的许可是什么。 -- 你可以“vendor”那个库。 无论许可证是否允许,我都可能不适合在未经许可的情况下这样做。但也许我会就 PyPI 上传的可能性与作者联系。 没错。如果我是你,我会联系他们并要求他们在 PyPI 上上传并提供帮助。 虽然这并不理想,但我认为这可能是 PyPI 施加的限制范围内的最佳解决方案,因此我将其标记为已回答。感谢您的帮助和建议。

以上是关于PyPI install_requires 直接链接的主要内容,如果未能解决你的问题,请参考以下文章

制作 python 包时将“install_requires”添加到 setup.py

python 用于从requirements.txt读取install_requires的代码段

如何从 setup.py install_requires 列表中安装 PyTorch 和相关工具?

Python中的匈牙利算法

pypi镜像源

如何将python模块放置到pypi库,如何编写python模块的安装文件使得其他开发者直接easy_install即可?