你怎么告诉pyximport使用cython -cplus选项?

时间:2011-10-01 11:39:15

标签: c++ python cython

pyximport非常方便,但我无法弄清楚如何让它参与Cython的C ++语言选项。从命令行运行cython --cplus foo.pyx。你如何通过pyximport获得相同的效果?谢谢!

3 个答案:

答案 0 :(得分:17)

使Cython创建C ++文件的一种方法是使用pyxbld文件。例如,创建包含以下内容的foo.pyxbld

def make_ext(modname, pyxfilename):
    from distutils.extension import Extension
    return Extension(name=modname,
                     sources=[pyxfilename],
                     language='c++')

答案 1 :(得分:3)

更轻量级/更少侵入性的解决方案是使用 setup_args/script_argspyximport 将传递给在幕后使用的 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"]

文档的 corresponding part 提到了 setup_args 的用法,但确切含义可能从代码本身中最清楚(here 是一个很好的起点)。

答案 2 :(得分:2)

您可以通过使用 cythonize 命令让 pyximport 进行扩展来让 pyximport 识别标题注释 # distutils : langauge = c++。为此,您可以在 filename.pyx 旁边创建一个新文件 filename.pyxbld

# filename.pyxbld

from Cython.Build import cythonize

def make_ext(modname, pyxfilename):
    return cythonize(pyxfilename, language_level = 3, annotate = True)[0]

现在您可以使用 distutils 标题注释:

# filename.pyx

# distutils : langauge = c++

Pyximport 将使用 .pyxbld 文件中的 make_ext 函数来构建扩展。并且 cythonize 会识别 distutils 标题注释。