目前,我的一个软件包需要一个JSON解析器/编码器,并且如果可用的话,可以使用simplejson
,如果需要,可以使用json
模块(在标准库中)(如基准显示{ {1}}更快。)
然而,最近它被击中&想念simplejson
是否会在使用simplejson
时安装 - 我相信移动到github。这让我感到疑惑;是否可以在我的zc.buildout
文件中定义可选包,如果不可用,则不会停止安装我的包?
答案 0 :(得分:10)
我假设你在谈论你的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
答案 1 :(得分:0)
AFAIK无法定义可选包,也没有用处。定义可选包时,您期望什么?它还没有安装时安装? (这会以某种方式强制执行)
不,恕我直言,解决这个问题的正确方法是在您想要使用该软件包的导入中。 E.g:
try:
from somespecialpackage import someapi as myapi
except ImportError:
from basepackage import theapi as myapi
这当然要求两个API兼容,但simplejson
和标准库json
包就是这种情况。