如何在Python包中支持备用依赖项?

3
我用Python编写了一个实用程序库,可与Qt框架配合使用。我的代码纯粹是Python编写的,与PyQt5和PySide2都兼容。我的主模块可以通过命令行运行python -m或导入到其他项目中。在wheel分发中,有没有一种干净的方式来指定项目需要PyQt5或PySide2呢?
以下是我在研究中发现的选项,但我想询问是否有更好的打包项目的方式:
我可以在项目的源分发中添加逻辑以检查PyQt5和PySide2。然而,wheels是分发Python项目的推荐方式,从我所知道的情况来看,这种安装时逻辑在wheels中不可能实现。或者,我可以不指定PySide2或PyQt5作为依赖项,并建议在安装说明中将它们之一与我的项目一起安装。

那么,当安装程序发现需要安装PySide2或者PyQt5时,应该发生什么呢? - undefined
1
如果两者都没有安装,我会倾向于选择其中一个。 - undefined
3个回答

6
使用 extras_require

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

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

pip install 'yourpackage[pyqt5]'

或者

pip install 'yourpackage[pyside2]'

0

如果你不想设置严格的要求(这是有道理的),那么我会在两者都不可用的情况下抛出运行时错误。

例如:

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

1
谢谢,我一定会这样做。不过我的问题是关于在打包过程中如何最好地处理指定的依赖项。 - undefined
为什么不尝试手动安装一个而不是引发ImportError呢? - undefined

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接