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