【问题标题】:What is the easiest way to make an optional C extension for a python package?为 python 包制作可选 C 扩展的最简单方法是什么?
【发布时间】:2011-05-02 16:22:39
【问题描述】:

我创建了一个 C 扩展,我想在我的 Python 包(使用 setuptools)中启用它,前提是传入命令行选项。最简单的方法是什么?

我似乎找不到任何直接的解决方法。

【问题讨论】:

    标签: python setuptools cython python-c-extension


    【解决方案1】:

    实际上有一个名为“功能”的分发/设置工具功能可用于此目的。 它被明确设计为让 setup.py 根据 --with-xxx--without-xxx 命令行选项执行不同的操作。

    • blog post 提供了一个很好的介绍,我目前找不到更好的文档(除了分发源 - the Feature classfeatures keyword)。
    • jinja 项目的 setup.py 将功能用于您的确切目的,它可能是一个很好的工作模板。
    • simplejson setup.py 也做了类似的事情,只是它被编码为总是尝试构建它定义的 C 扩展功能,并在构建失败时优雅地退回到纯 python;这也可能对您的目的有用。

    【讨论】:

    【解决方案2】:
    ext_modules = []
    if '--add-this' in sys.argv:
        ext_modules.append(Extension(...))
        sys.argv.remove('--add-this')
    setup(...
          ext_modules = ext_modules
    )
    

    这是 hacky,但可能是最简单的。更高级的方法是扩展 Distribution 类以支持标志,例如 --with-modules,然后在 finalize_options 中自定义 ext_modules。

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2010-11-01
      • 1970-01-01
      • 2013-08-19
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2011-02-10
      相关资源
      最近更新 更多