为Python包制作可选C扩展的最简单方法是什么?
我创建了一个C语言扩展,想在我的Python包中使用它,但只有在命令行中传入一个选项时才启用。请问有什么简单的方法可以做到这一点吗?
我好像找不到什么直接的方法来实现这个。
2 个回答
15
其实,有一个叫“功能”的特性在distribute/setuptools里,可以用来实现这个需求。这个特性专门设计用来让setup.py根据命令行选项--with-xxx
和--without-xxx
做不同的事情。
- 这篇博客文章对这个特性做了很好的介绍,目前我找不到比这更好的文档了(除了Distribute的源代码 - Feature类和features关键字)。
- jinja项目的setup.py正好使用了这个功能,可能是一个不错的模板,可以参考。
- simplejson的setup.py也做了类似的事情,不过它的代码是设定为总是尝试构建它定义的C扩展功能,如果构建失败则优雅地回退到纯Python;这对你也可能有帮助。
4
ext_modules = []
if '--add-this' in sys.argv:
ext_modules.append(Extension(...))
sys.argv.remove('--add-this')
setup(...
ext_modules = ext_modules
)
这个方法有点小技巧,但可能是最简单的。更高级的做法是扩展Distribution类,让它支持一个标志,比如 --with-modules
,然后在finalize_options里面自定义ext_modules。