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

Posted

技术标签:

【中文标题】使用 gcc 编译 cython:#include "ios" 中没有这样的文件或目录【英文标题】:Compiling cython with gcc: No such file or directory from #include "ios" 【发布时间】:2018-11-25 20:32:57 【问题描述】:

给定一个文件docprep.pyx 这么简单

from spacy.structs cimport TokenC

print("loading")

并试图通过 cythonize 它

cythonize -3 -i docprep.pyx

我收到以下错误消息

docprep.c:613:10: fatal error: ios: No such file or directory
 #include "ios"
          ^~~~~
compilation terminated

从路径可以看出,该系统安装了 Python 3.7 的 Anaconda。 numpyspacycython都是通过conda安装的。

【问题讨论】:

ios 是一个 c++ 头文件(我不知道它来自哪里,但他们应该称它为 #include <ios>),所以你可能需要将它构建为 c++,即 @ 987654332@ Using C++ STL maps in Cython的可能重复 @ead 谢谢,这就是问题所在。然后我需要修复 4 个额外的问题:1)编译 .cpp 文件,而不是 .c 文件 2)使用 cython 和 --embed 3)将 main 函数添加到 python 程序 4)使用 -lpython3.7m 而不是-lpython3.7。谢谢! @DavidW 这不是重复的。这个问题是关于独立编译的。没有setup.py 或Python 文件调用pyx 在我的情况下--cplus 不起作用,我需要在 setup.py 文件中添加language="c++" 【参考方案1】:

在我的例子中,它使用@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),
)

【讨论】:

您也可以在.pyx文件开头添加以下行:# distutils: language = c++【参考方案2】:

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

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

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

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

实际上,cythonize 没有命令行选项来触发 c++ 生成,因此第一个选项看起来是最好的选择:

# distutils: language = c++

from spacy.structs cimport TokenC
print("loading") 

问题在于 spacy/structs.pxd 使用 c++-constructs、for example vectors 或从 libcpp 导入的任何其他 c:

...
from libcpp.vector cimport vector
...

因此构建也需要 c++ 库/头文件。

【讨论】:

我认为 distutils: language 选项通常是要走的路 - 语言的选择确实需要 pyx 文件,因此必须将选择器放在其他任何地方只会使跟踪正在发生的事情变得更加困难. (不过,列出所有选项肯定很有用)

以上是关于使用 gcc 编译 cython:#include "ios" 中没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cython 中使用不同的 C++ 编译器?

使用cython将py文件编译成so文件

如何从 cython 设置文件中删除 -pthread 编译器标志

无法将 cpplist 导入 Cython?

使用 Cython 加速连接组件算法

OSX 的 Cython 链接错误