如何支持 Python 包中的替代依赖项?

How to support alternate dependencies in a Python package?

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

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

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

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

例如

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

使用extras_require:

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

并教您的用户 运行

pip install 'yourpackage[pyqt5]'

pip install 'yourpackage[pyside2]'

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

中的主模块