给定一个文件
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
安装的。
在我的例子中,它使用@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),
)
<ios>
是一个 C++ 头文件。错误消息显示您尝试将 C++ 代码编译为 C 代码。
默认情况下,Cython 将生成一个扩展名为
*.c
的文件,稍后编译器将其解释为 C 代码。
Cython 还可以为 c++ 生成具有正确文件扩展名的文件,即
*.cpp
。有多种方法可以触发此行为:
# distutils: language = c++
文件的开头添加 pyx
。language="c++"
添加到 Extension
文件中的 setup.py
定义。cython
,并选择 --cplus
。%%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++ 库/头文件。
我知道这是一篇旧文章,但当我尝试在 MacOS 15.1.1 上安装一个在后台使用 cython 的 python 包时,我也遇到了这个问题。我在我的 mac 上安装了命令行工具,但没有安装 xcode,这最终成为了问题。一旦我安装了 xcode 并在本地运行
sudo xcode-select --reset
,ios 标头就立即可用。
一个好的检查是你得到以下输出:
xcode-select --print-path
>>> /Applications/Xcode.app/Contents/Developer
希望这对下一个人有帮助!