我可以在setuptools中定义可选包吗?

时间:2012-06-28 07:52:40

标签: python setuptools

目前,我的一个软件包需要一个JSON解析器/编码器,并且如果可用的话,可以使用simplejson,如果需要,可以使用json模块(在标准库中)(如基准显示{ {1}}更快。)

然而,最近它被击中&想念simplejson是否会在使用simplejson时安装 - 我相信移动到github。这让我感到疑惑;是否可以在我的zc.buildout文件中定义可选包,如果不可用,则不会停止安装我的包?

2 个答案:

答案 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包就是这种情况。