为python包制作可选C扩展的最简单方法是什么?

时间:2010-10-30 00:11:02

标签: python setuptools cython python-c-extension

我已经创建了一个C扩展,只有在传入命令行选项时才能在我的Python包中启用(使用setuptools)。最简单的方法是什么?

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

2 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:3)

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。