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

问题描述 投票:0回答:3

给定一个文件

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。

numpy
spacy
cython
都是通过
conda
安装的。

python cython
3个回答
10
投票

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

8
投票

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

默认情况下,Cython 将生成一个扩展名为

*.c
的文件,稍后编译器将其解释为 C 代码。

Cython 还可以为 c++ 生成具有正确文件扩展名的文件,即

*.cpp
。有多种方法可以触发此行为:

  • # distutils: language = c++
    文件的开头添加
    pyx
  • language="c++"
    添加到
    Extension
    文件中的
    setup.py
    定义。
  • 致电
    cython
    ,并选择
    --cplus
  • 在 IPython 中,用
    %%cython
    调用
    -+
    魔法,即
    %%cython -+
  • 有关使用
    pyximport
    构建时的替代方案,请参阅 这个 SO 问题

实际上,对于

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

# distutils: language = c++

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

问题是

spacy/structs.pxd
使用 C++ 构造,例如向量或从
libcpp
导入的任何其他内容:

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

因此构建还需要 C++ 库/头文件。


0
投票

我知道这是一篇旧文章,但当我尝试在 MacOS 15.1.1 上安装一个在后台使用 cython 的 python 包时,我也遇到了这个问题。我在我的 mac 上安装了命令行工具,但没有安装 xcode,这最终成为了问题。一旦我安装了 xcode 并在本地运行

sudo xcode-select --reset
,ios 标头就立即可用。

一个好的检查是你得到以下输出:

xcode-select --print-path
>>> /Applications/Xcode.app/Contents/Developer

希望这对下一个人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.