Python需求与PyPi冲突

2024-06-26 19:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目需要一些DevOps TLC,所以我最终构建了我的安装脚本。这最终将是一个可由pip在本地安装的包,但最终可能不会出现在PyPI中

它对名为u2py的模块有依赖关系It is this package,为U2数据库操作创建,not this package,为。。。还有别的。我想要的只有第三方供应商(Rocket)安装过,我不想要的是PyPI

在这种情况下,我的软件包的预期行为应该是什么?我将在自述文件中包含一个关于此的简介,但这是否足够

我曾经考虑过抛出一个异常来识别错误的包何时出现,但这让我觉得很奇怪。似乎最具python风格的事情是不要将其添加到我的安装脚本中,而盲目地假设import u2py会产生一个我可以使用的模块。如果它像鸭子一样呱呱叫,像鸭子一样解析DynArray,像鸭子一样解析call()sSUBROUTINE,那么它就是鸭子,对吗?否则,如果出现错误,用户将直接去实际阅读文档

我已经看过了,但不确定他们是否适用于这里


Tags: 模块pip项目脚本pypipackage关系is
3条回答

理想情况下,在安装时(在setup.py)会有一种方法来检测包是否安装到“u2环境”中,如果是这种情况,安装可能会失败(并显示相应的错误消息)

使用此解决方案,您将无法提供内置发行版(wheels),因为它们在安装时不执行setup.py文件,但只发布源发行版就可以了

在这种情况下,如果Python项目有名称空间(pip install com.rocket.u2pyimport com.rocket.u2py as u2py),那就更好了

我认为有两个方面需要考虑:在项目层面,在层面

1.项目(分发包)

我认为将替代下载源强加于项目的最终用户是一种不好的做法。默认情况下,pip应该从PyPI下载,除非用户自己决定(通过 find-links或类似选项,您可以在文档中指示用户这样做)

因为这是一个利基依赖,我想我不会把它添加到install_requires。我假设您项目的最终用户已经知道依赖关系,并且能够自己直接安装它

另外,我不认为在安装时可以可靠地检查是否安装了正确的依赖项,因为setup.py并不总是运行(覆盖bdist_wheel命令会有所帮助,但可能不是100%有效)

2.包装(可进口包装)

我不确定是否需要采取一些具体行动。由于模块或函数不可导入,代码很可能迟早会自然失败。也许可以,也许

但是,检测是否安装了依赖项(而且是正确的依赖项)可能相对容易,并且可以提供更好的用户体验。检查某些特定模块或功能是否可导入。或者检查元数据(import importlib_metadata; importlib_metadata.distribution('u2py').metadata['Author']

在申请的情况下,我会尝试尽快优雅地失败。对于库,我会尝试找到一个策略点来进行检查,并引发一个自定义异常(CannotFindU2pyException


链接:

您可以使用setuptools(需要pip版本18.1或更高版本)在install_requires中指定包的url

Requirement specifiers

范例

setup.py

import setuptools

setuptools.setup(
    name='MyPackage',
    version='1.0.0',
    # ...
    install_requires=[
        'requests @ https://github.com/psf/requests/archive/v2.22.0.zip'
    ]
    # ...
)

和dopython setup.py install

Since version 19.1, pip also supports direct references like so:

SomeProject @ file:///somewhere/...

参考号

相关问题 更多 >