一.配置环境
python 本身不能运行 cpython 的语法,需要 编译 后引用
需要 gcc 编译器 和 cython 编译器
gcc编译器 把 c语言 编译成扩展模块
Cython 编译器是一种源到源的编译器 python 语法编译成 c语法
1.安装gcc 编译器
gcc 编译器可以下载 Visual Studio 或者 MinGW
MinGW-w64官方网站首页(http://mingw-w64.org/)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d8543ac0473446708d2aae68c6e3fe6d.png
直接下载最近版本的online installer根本连接不到对方的文件库,所有下载所有文件的zip
这个世界上只有两种操作系统,符合 posix 协议的,和 Windows 。如这个笑话所说的,如果你想要开发 Windows 程序,需要选择 win32 ,而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。
操作:我只开发在 Windows 下运行的程序,所以选择了 win32 。
异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,seh 是新发明的,而 sjlj 则是古老的。seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。
操作:我这里选择了 seh 。
说明:选择了 32位 后,则可以用 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,可以它不支持 64位 。
操作:建议选择 dwarf 。
配置系统环境变量
添加你的mingw64/bin,如:D:\mingw64\bin
使用cmd命令运行成功则如下图
gcc -v
2.安装cython编译器
pip install Cython
#正常运行则成功
from Cython import __version__
print(__version__) # 0.29.14
二.编译运行
创建 cython文件 fib.pyx
def fib(n):
"""这是一个扩展模块"""
cdef int i
cdef double a=0.0, b=1.0
for i in range(n):
a, b = a + b, a
return a
创建 setup.py 文件编译 cython
from distutils.core import setup
from Cython.Build import cythonize
# 我们说构建扩展模块的过程分为两步:
# 1)将 Cython 代码翻译成 C 代码;
# 2)根据 C 代码生成扩展模块
# 第一步要由 Cython 编译器完成, 通过 cythonize;
# 第二步要由 distutils 完成, 通过 distutils.core 下的 setup
setup(ext_modules=cythonize("Z:\\code\\sj\\python\\dev\\codecython\\test.pyx", language_level=3))
# 里面还有一个参数 language_level=3
# 表示只需要兼容 Python3 即可,而默认是 2 和 3 都兼容
# 如果你是 Python3 环境,那么建议加上这个参数
# cythonize 负责将 Cython 代码转成 C 代码
# 然后 setup 根据 C 代码生成扩展模块
然后编译
python setup.py build
成功 执行完命令之后,当前目录会多出一个 build 目录,里面的结构如图所示。重点是那个 fib.cp38-win_amd64.pyd 文件
如果出现
则重新下载 build tools
三.引用
import fib
# 我们看到该 pyd 文件直接就被导入了
# 至于中间的 cp38-win_amd64 指的是解释器版本、操作系统等信息
print(fib)
参考资料
编译并运行 Cython 代码的几种方式
MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本