填坑 CentOS7 使用 Python3 安装 Cython 编写扩展

前文参见 《CentOS 7 下通过 Cython 编写 python 扩展 》, 用的是 Python2.7,本文用的是 Python3.6

yum install python3 python3-devel gcc
pip3 install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple

创建 pyx 文件与前文一致

python3 setup.py -build_ext --inplace 

如遇到出错,报告

hello.c:2264:3: error: ‘for’ loop initial declarations are only allowed in C99 mode

表示当前的 gcc 4.8.5 默认仅支持 C89 标准, 不兼容在 for 中定义循环变量,搜索一圈没找到如何在 setup.py 中传参支持 -std=c99,ChatGPT 倒是给了个方案

from setuptools import setup, Extension
extensions = [Extension("your_module", ["your_module.pyx"], extra_compile_args=["-std=c99"])]
etup(
    ext_modules=extensions,
    # other setup parameters...
)

可惜运行下来还是一样的错误,还尝试过添加文件头

# distutils: language=c++
# distutils: define_macros=PY_SSIZE_T_CLEAN
# cython: language_level=3
# cython: extra_compile_args=['-std=c99']


也不解决问题。好在已经生成了 hello.c,于是参考控制台输出自己手动完成后续编译

gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -O2 \
-g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \
-fstack-protector-strong --param=ssp-buffer-size=4 \
-grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE \
-fPIC -fwrapv -fPIC -I/usr/include/python3.6m -c hello.c -o \
hello.o -std=c99

不错,生成了 hello.o 之后,再通过

gcc -shared hello.o -o hello.so

终于得到了 hello.so 文件,运行调用

python3 hello.py

输出 

Hello cython

尝试通过Python2 调用会报错

python hello.py 
ImportError: /root/hello_pack/hello.so: undefined symbol: _Py_FalseStruct

应该是不兼容 Python2

posted @   树欲静·而风不止  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示