pyximport非常方便,但我无法弄清楚如何让它参与Cython的C ++语言选项。从命令行运行cython --cplus foo.pyx
。你如何通过pyximport获得相同的效果?谢谢!
答案 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_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"]
。
文档的 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 标题注释。