首页 > 解决方案 > 通过 Cython 将 Python 转换为 C 后,得到未定义的符号 _Py_CheckRecursionLimit

问题描述

为了在 Android OS 中执行一段代码,其中一些涉及 Python 脚本,我通过 Cython 将 Python 脚本转换为 C,如下所示。setup.py 有这个:

from setuptools import setup
from Cython.Build import cythonize
from Cython.Compiler import Options

Options.embed = "main"

setup(
 ext_modules = cythonize("make_region.pyx")
)

接下来,使用以下命令转换为 C:

python3 setup.py build_ext --inplace

生成make_region.c(注意:Python版本是3.10.0)然后编译make_region.c:

 gcc  make_region.c -o make_region.exe -I/home/me/PYTHON-3.10.0/include/python3.10 -L/home/me/PYTHON-3.10.0/lib -lpython3.10 -ldl -lm -lutil -lpthread

这产生了一个初始错误:没有名为 numpy.core._multiarray_umath 的模块。许多帖子建议通过以下方式解决此问题:

 pip install numpy --upgrade

但是,这并没有解决我的问题,因此通过执行以下操作规避了此错误:

 ln -s _multiarray_umath.cpython-37m-x86_64-linux-gnu.so _multiarray_umath.so

在 numpy/core 中(注意:我在工作目录中创建了 numpy 的本地副本)。编译 make_region.c 的新尝试正在产生:

 numpy/core/_multiarray_umath.so: undefined symbol: _Py_CheckRecursionLimit

实际上,这个符号没有在这个共享对象库中定义,也没有在 numpy/core 中的任何 *.so 中定义。在https://bugs.python.org/issue41834出现了一些搜索,建议从 Python 3.9 版开始删除 _Py_CheckRecursionLimit 符号。但是,到目前为止,我在这个问题上没有看到任何关于 numpy 的内容。非常欢迎任何人对此问题提出任何建议/想法。

标签: pythonnumpycython

解决方案


推荐阅读