如何在Python包中支持替代依赖关系?

时间:2018-09-12 03:08:59

标签: python packaging python-wheel

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

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

我可以在项目的源代码分发中为setup.py添加逻辑以检查PyQt5和PySide2。但是,建议使用转轮分发Python项目的方式,从我可以看出,转轮无法实现这种安装时逻辑。另外,我无法将PySide2或PyQt5指定为依赖项,并在安装说明中建议将其中之一与我的项目一起安装。

3 个答案:

答案 0 :(得分:3)

使用extras_require

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

并教您的用户运行二者之一

pip install 'yourpackage[pyqt5]'

pip install 'yourpackage[pyside2]'

答案 1 :(得分: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

答案 2 :(得分:0)

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