我在Python中编写了一个与Qt框架一起使用的实用程序库。我的代码是纯Python,兼容PyQt5和PySide2。我的主模块既可以通过python -m
从命令行自行运行,也可以导入到另一个项目中。是否有一种干净的方法来指定项目在轮子分配中需要PyQt5或PySide2?
以下是我在研究中发现的内容,但我要问的是,有一种更好的方法来打包项目而不是这些选项:
我可以在项目的源代码发行版中为setup.py
添加逻辑,以检查PyQt5和PySide2。但是,推荐使用轮子来分发Python项目,而据我所知,这种安装时逻辑不可能用于轮子。或者,我无法将PySide2或PyQt5指定为依赖项,并在安装说明中建议将其中一个与我的项目一起安装。
setup(
…
extras_require={
'pyqt5': ['PyQt5'],
'pyside2': ['PySide2'],
},
)
并教你的用户运行任何一个
pip install 'yourpackage[pyqt5]'
要么
pip install 'yourpackage[pyside2]'
如果你不想要一个严格的要求(这是有意义的),我只是抛出一个运行时错误,如果两者都不可用。
例如
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
我的特殊情况有点小众(所以我不接受这个作为答案)。我意识到这个包实际上做了两件事:充当库和命令行工具。我决定把它分成两个包:package
和package-cli
。 package
没有明确依赖PyQt5或PySide2,但指定必须在文档中安装其中一个。由于package
是一个图书馆,它旨在被整合到另一个项目中,在package
中很容易将PyQt5
和requirements.txt
列在一起。对于package-cli
,我只选择PyQt5
或PySide2
中的一个作为显式依赖。 package-cli
依赖于package
和PyQt5
,只需添加一个console_script来调用package
中的主模块。