目的:编译python为so文件以达到保护代码加速等目的
环境 windows
这里我参考了很多文档编写,结果均无法生成 so 文件
搜索关键字:
具体流程如下
def say():
print('???say what !')
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("test.py",language_level=3) #注意这里推荐使用相对路径,编译出的so文件在引用其他模块时可能会出现路径问题
)
这里如果直接执行python3 transform.py 可能会报错
这里可以在执行的时候加上 --help-commands 查看有哪些命令
这里我们用 build_ext
python3 transform.py build_ext --inplace
(–inplace 是指在当前目录生成)
这里执行完成会生成一个文件夹和两个文件
这里我查了半天,不是说好生成so文件调用的吗?怎么没有了。
然而解释就是,so文件是linux下生成的,windows下生成的是pyd文件
这里参考https://blog.csdn.net/ningyanggege/article/details/120763018
1、pyx
.pyx 文件是由 Cython 编程语言 “编写” 而成的 Python 扩展模块源代码文件;类似于 C 语言的 .c 源代码文件,.pyx 文件中有 Cython 模块的源代码
2、pyd与so
不像 Python 语言可直接解释使用的 .py 文件,.pyx 文件必须先被编译成 .c 文件,再编译成 .pyd (Windows 平台) 或 .so (Linux 平台) 文件,才可作为模块 import 导入使用。
单独把pyd文件粘贴出来,防止和源py文件混着看不出效果。
代码很简单
import test
test.say()
然后就可以看到结果了
注意事项:
这里需要注意,生成的test.cp37-win_amd64.pyd 不可以任意更改名字。你可以把版本信息删掉,但是test应该是不能改的,我之前测试的时候就是改了名字然后报错
ImportError: dynamic module does not define module export function (PyInit_aaa)
步骤同上,注意内容同上,只是生成的文件会变为 .so 文件。