【问题标题】:How to support alternate dependencies in a Python package?如何在 Python 包中支持备用依赖项?
【发布时间】:2019-02-16 14:36:42
【问题描述】:

我用 Python 编写了一个与 Qt 框架配合使用的实用程序库。我的代码是纯 Python 并且兼容 PyQt5 和 PySide2。我的主模块既可以使用python -m 从命令行单独运行,也可以导入到另一个项目中。有没有一种简洁的方法来指定项目在其轮子分布中需要 PyQt5 或 PySide2?

这是我在研究中发现的,但我想问是否有比这些选项更好的打包项目的方法:

我可以在项目的源代码分发中向setup.py 添加逻辑以检查 PyQt5 和 PySide2。但是,推荐使用轮子来分发 Python 项目,据我所知,轮子无法实现这种安装时逻辑。或者,我无法将 PySide2 或 PyQt5 指定为依赖项,并在安装说明中建议将其中一个与我的项目一起安装。

【问题讨论】:

  • 那么,当安装程序看到他必须安装 PySide2 或 PyQt5 时会发生什么?
  • 如果两者都没有安装,我会选择一个。

标签: python packaging python-wheel


【解决方案1】:

使用extras_require:

setup(
    …
    extras_require={
        'pyqt5': ['PyQt5'],
        'pyside2': ['PySide2'],
    },
)

并教您的用户运行其中一个

pip install 'yourpackage[pyqt5]'

pip install 'yourpackage[pyside2]'

【讨论】:

    【解决方案2】:

    如果您不想做出任何严格的要求(这是有道理的),如果两者都不可用,我只会抛出运行时错误。

    例如

    try:
       import PyQt5 as some_common_name
    except ImportError:
       try:
           import PySide2 as some_common_name
       except ImportError:
           raise ImportError('Please install either PyQt5 or PySide2') from None
    

    【讨论】:

    • 谢谢,我一定会这样做的。我的问题是关于如何最好地处理在打包过程中指定依赖项。
    • 为什么不尝试手动安装一个而不是引发 ImportError?
    【解决方案3】:

    我的特殊情况有点小众(所以我不接受这个作为答案)。我意识到这个包实际上做了两件事:充当库和命令行工具。我决定把它分成两个包:packagepackage-clipackage 没有明确依赖 PyQt5 或 PySide2,但指定必须在文档中安装其中之一。由于package 是一个库,因此它旨在集成到另一个项目中,以便在requirements.txt 中将packagePyQt5 一起列出。对于package-cli,我只需选择PyQt5PySide2 之一作为显式依赖项。 package-cli 依赖于packagePyQt5 并且只是添加了一个console_script 来调用package 中的主模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2019-05-13
      • 2012-01-06
      • 2015-06-15
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多