如何让pyximport使用cython --cplus选项?

20 投票
4 回答
4797 浏览
提问于 2025-04-17 03:29

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++')

撰写回答