cpython编译与运行

一.配置环境

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.pngcpython编译与运行_第1张图片

cpython编译与运行_第2张图片

直接下载最近版本的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 。

cpython编译与运行_第3张图片
配置系统环境变量
添加你的mingw64/bin,如:D:\mingw64\bin
使用cmd命令运行成功则如下图

gcc -v

cpython编译与运行_第4张图片

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
cpython编译与运行_第5张图片

cpython编译与运行_第6张图片

三.引用

import fib
# 我们看到该 pyd 文件直接就被导入了
# 至于中间的 cp38-win_amd64 指的是解释器版本、操作系统等信息
print(fib) 

参考资料
编译并运行 Cython 代码的几种方式
MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

你可能感兴趣的:(python,工具,windows,python,linux)