使用 gcc 编译 cython:#include "ios" 中没有这样的文件或目录

tso*_*orn 9 python cython

给定一个docprep.pyx简单的文件

from spacy.structs cimport TokenC

print("loading")
Run Code Online (Sandbox Code Playgroud)

并试图通过

cythonize -3 -i docprep.pyx
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息

docprep.c:613:10: fatal error: ios: No such file or directory
 #include "ios"
          ^~~~~
compilation terminated
Run Code Online (Sandbox Code Playgroud)

从路径中可以看出,该系统安装了 Python 3.7 的 Anaconda。numpyspacy并且cython都是通过conda.

Die*_*les 8

在我的情况下,它使用@mountrix 提示工作,只需将其添加language="c++"到您的 setup.py 中,例如:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy


extensions = [
    Extension("processing_module", sources=["processing_module.pyx"], include_dirs=[numpy.get_include()], extra_compile_args=["-O3"], language="c++")
]

setup(
    name="processing_module",
    ext_modules = cythonize(extensions),
)
Run Code Online (Sandbox Code Playgroud)


ead*_*ead 5

<ios>是一个 c++ 头文件。错误消息显示您尝试将 C++ 代码编译为 C 代码。

默认情况下,Cython 将生成一个扩展名为 的文件,*.c稍后编译器会将其解释为 C 代码。

Cython 还可以为 C++ 生成具有正确文件扩展名的文件,即*.cpp. 并且有多种方法可以触发这种行为:

  • # distutils: language = c++pyx-file的开头添加。
  • 添加language="c++"到-file 中的Extension定义setup.py
  • 调用cython选项--cplus
  • 在 IPython 中,用 调用%%cython魔法-+,即%%cython -+
  • 有关使用 构建时的替代方案pyximport,请参阅此 SO-question

实际上,因为cythonize没有命令行选项来触发 c++-generation,因此第一个选项看起来是最好的方法:

# distutils: language = c++

from spacy.structs cimport TokenC
print("loading") 
Run Code Online (Sandbox Code Playgroud)

问题是spacy/structs.pxd 使用 c++-constructs,例如向量或任何其他 cimported from libcpp

...
from libcpp.vector cimport vector
...
Run Code Online (Sandbox Code Playgroud)

因此,构建还需要 c++-libraries/headers。