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

问题描述 投票:0回答:3

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

以下是我在研究中发现的内容,但我要问的是,有一种更好的方法来打包项目而不是这些选项:

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

python packaging python-wheel
3个回答
3
投票

使用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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.