【问题标题】:Python requirements conflict with PyPiPython 需求与 PyPi 冲突
【发布时间】:2020-06-02 20:40:28
【问题描述】:

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

它依赖于一个名为u2py 的模块。 It is this package,为 U2 数据库操作创建,not this package,用于...其他东西。我想要的只是由第 3 方供应商(Rocket)安装的,我不想要的在 PyPI 中。

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

我曾考虑抛出异常来识别错误包何时存在,但这让我感到很奇怪。似乎最pythonic的事情是不要将它添加到我的安装脚本中,并盲目地假设import u2py会导致我可以使用的模块。如果它像鸭子一样嘎嘎叫,像鸭子一样解析DynArrays,像鸭子一样解析call()s SUBROUTINEs,那么它就是鸭子,对吧?否则,如果出现错误,用户只会去实际阅读文档。

我查看了classifiers,但不确定它们是否适用于此。

【问题讨论】:

  • 另外,也许回答这个问题的人有机会回答另一个类似的问题:stackoverflow.com/questions/41602869/…
  • ".. 如果出现错误,用户将直接去实际阅读文档。"不,他们会(不会)在 Stack Overflow 上发布他们的代码并说“它不起作用”。你准备好处理这些问题了吗?你可以抛出一个错误,告诉它不是正确的包。如果终端支持,请将其设为粗体。
  • @usr2564301,区分它是哪个包的最佳方法是什么?我是否应该尝试检查是否存在唯一功能或类似功能?这是否违反了任何隐含的鸭子打字合同?我是不是想得太多了?
  • 让我们等待 Python Powerhouses 可能会告诉我们什么。这是一个有趣的话题。
  • @DustinIngram,我不知道。目标受众是那些已经在使用 u2py 环境的人,我的软件包不太可能使任何新的转换为这种非常古老和小众的技术.但是,这让很多人已经不了解 u2 环境,安装并尝试一下,然后看着他们的代码着火并且永远无法工作。看来我需要解决第二种情况而不是第一种情况。

标签: python pip setup.py pypi u2


【解决方案1】:

如果 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)。


链接:

【讨论】:

    【解决方案2】:

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

    使用此解决方案,您将无法提供内置发行版(轮子),因为它们在安装时不执行 setup.py 文件,但仅发布源发行版应该没问题。

    【讨论】:

    • 不会 pip 构建一个 wheel 并将其缓存在本地以用于以下安装,这样setup.py 将只执行一次? stackoverflow.com/q/58289062/11138259
    • 可能,但是如果是本地构建的,构建时的检查会成功,构建的轮子只会在它构建的平台上使用。
    【解决方案3】:

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

    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'
        ]
        # ...
    )
    

    然后做python setup.py install

    还有

    从 19.1 版本开始,pip 还支持直接引用,如下所示:

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

    参考

    【讨论】:

    • u2py 依赖不是 pip 可安装的,它来自安装父包的环境。这也不能处理用户错误的情况 u2py从 PyPI 安装。
    猜你喜欢
    • 2019-04-11
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多