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

标签 python setuptools

目前我的一个包需要一个 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/

相关文章:

python - easy-install.pth 和 *.egg-link 中冗余条目背后的动机是什么?

python - key 错误 : Creating a dataframe column using square root of the sum of square of two column values

python - 在keras中的自定义损失函数中做一些数学计算

python - 防止包安装在旧的 Python 版本上

python-3.x - 如何在 setup.py 中指定递归依赖?

python - 当 Progressbar-2.3.dev0 已安装时,setuptools 尝试(但失败)安装 Progressbar-2.3。如何正确制定需求?

python - 如何在 Python 中创建和加载 egg 文件?

python - 更新 Python Pickle 文件

python - 根据另一列填写空单元格

python - 将新元素添加到结构 pyspark 的嵌套数组