目前我的一个包需要一个 JSON 解析器/编码器,并且被设计为使用 simplejson
如果可用回落到 json
模块(在标准库中)如果必要的(因为基准显示 simplejson
更快)。
但是,最近关于在使用 zc.buildout
时是否会安装 simplejson
的问题受到了质疑 - 我相信这与向 github 的转移有关。这让我想知道;是否可以在我的 setup.py
文件中定义可选包,如果不可用,不会停止我的包的安装?
最佳答案
安装时的可选包。
我假设您正在谈论您的 setup.py
脚本。
您可以将其更改为:
# mypackage/setup.py
extras = {
'with_simplejson': ['simplejson>=3.5.3']
}
setup(
...
extras_require=extras,
...)
然后您可以执行以下任一操作:
pip install mypackage
,pip install mypackage[with_simplejson]
后者安装 simplejson>=3.5.3
。
与其尝试安装所有内容并回退到已知的良好版本,不如 您可能想要安装您知道有效的软件包子集。
执行时的可选包。
一旦你有两组不同的包可以安装,你需要
以确保您可以使用它们(如果可用)。例如。对于您的 json
导入:
try:
# helpful comment saying this should be faster.
import simplejson as json
except ImportError:
import json
另一个更复杂的例子:
try:
# xml is dangerous
from defusedxml.cElementTree import parse
except ImportError:
try:
# cElementTree is not available in older python
from xml.cElementTree import parse
except ImportError:
from xml.ElementTree import parse
但是你也可以在一些包中找到这种模式:
try:
optional_package = None
import optional.package as optional_package
except ImportError:
pass
...
if optional_package:
# do addtional behavior
关于python - 我可以在 setuptools 中定义可选包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11240285/