如何让pyximport使用cython --cplus选项?
pyximport这个工具非常好用,但我不太明白怎么让它使用Cython的C++语言选项。在命令行中,你可以运行 cython --cplus foo.pyx
来实现这个功能。那么,使用pyximport的时候,怎么才能做到同样的事情呢?谢谢!
4 个回答
5
一个更轻量级、干扰更小的解决方案是使用 setup_args/script_args
,这些参数会被 pyximport
传递给底层使用的 distutils
。
script_args = ["--cython-cplus"]
setup_args = {
"script_args": script_args,
}
pyximport.install(setup_args=setup_args, language_level=3)
对于 python setup.py build_ext
的其他选项,也可以用类似的方式传递,比如 script_args = ["--cython-cplus", "--force"]
。
文档中提到的 相关部分提到了 setup_args
的用法,但具体的意思可能从代码中看得更清楚(这里是一个很好的起点)。
9
这里有个小技巧。
下面的代码修改了 pyximport
中的 get_distutils_extension
函数,这样它创建的 Extension
对象的 language
属性都会被设置为 c++
。
import pyximport
from pyximport import install
old_get_distutils_extension = pyximport.pyximport.get_distutils_extension
def new_get_distutils_extension(modname, pyxfilename, language_level=None):
extension_mod, setup_args = old_get_distutils_extension(modname, pyxfilename, language_level)
extension_mod.language='c++'
return extension_mod,setup_args
pyximport.pyximport.get_distutils_extension = new_get_distutils_extension
把上面的代码放到一个叫做 pyximportcpp.py 的文件里。然后,不要使用 import pyximport; pyximport.install()
,而是用 import pyximportcpp; pyximportcpp.install()
。
21
让Cython生成C++文件的一种方法是使用一个叫做pyxbld的文件。比如,你可以创建一个名为 foo.pyxbld
的文件,里面写入以下内容:
def make_ext(modname, pyxfilename):
from distutils.extension import Extension
return Extension(name=modname,
sources=[pyxfilename],
language='c++')