使用Cython对python代码编译
背景:
我们知道Python是一门解释型语言,当我们想让其他人运行我们的代码时,如果直接将.py源代码发送给他人,那么源代码将没有任何安全性可言,也就是任何一个人都可以打开源代码一看究竟,任何人都可以随意修改源代码。因此当我们想保护我们的源代码(算法保护)或者防止用户篡改源代码时,可以将Python源代码编译生成.pyd库文件或者.so库文件(Windows平台生成pyd文件,Linux生成so文件)。
事实上,Python和Java的解释方式是相同的,只是我们表面上看Python是直接解释源代码,而实际上python解释器只会加载字节码。细心的小伙伴肯定发现了这一点,当我们import某个模块时,总是会在模块所在的目录创建一个__pycache__目录,里面存放着被加载模块的字节码文件。
Python有以下几种类型的文件:
py:Python控制台程序的源代码文件
pyw:Python带用户界面的源代码文件
pyx:Python包源文件
pyc:Python字节码文件(可通过逆向编译来得到源码)
pyo:Python优化后的字节码文件(可通过逆向编译来得到源码)
pyd:在Windows平台上Python的库文件(Python版DLL)
so:在Linux平台上是so文件
步骤:
1、安装Cython
pip install Cython
2、编写转换文件
文件名py_to_pyd.py
import Cython.Build import distutils.core def py_to_pyd(file): cpy = Cython.Build.cythonize(file) # 返回distutils.extension.Extension对象列表 distutils.core.setup( name = 'pyd的编译', # 包名称 version = "1.0", # 包版本号 ext_modules= cpy, # 扩展模块 author = "",#作者 author_email=""#作者邮箱 ) if __name__ == '__main__': file = "test.py" #需要编译的文件 py_to_pyd(file)
3、执行转换
python py_to_pyd.py build_ext --inplace
3.1 在windows下执行:
执行完生成文件:
其中say_hello.c是中间文件,不用关心,直接删除
say_hello.cp36-win_amd64.pyd 就是我们要的编译后文件,windows下生成的是pyd文件。
测试一下:
1、先删除say_hello.c和say_hello.py文件
2、测试编译后的包能否导入和调用文件中方法
测试完成,没有问题,可以将名称改为say_hello.pyd,也可以不改,经测试都能引入并调用。
3.2 Linux下执行
执行会生成:say_hello.cpython-36m-x86_64-linux-gnu.so
测试一下:
1、先删除say_hello.c和say_hello.py文件
2、测试编译后的包能否导入和调用文件中方法
测试完成,没有问题,可以将名称改为say_hello.so,也可以不改,经测试都能引入并调用。
会遇到的问题
1、执行编译命令:
python py_to_pyd.py build_ext --inplace
报错1:Unable to find vcvarsall.bat
原因:缺少Visual C++
解决:
1、下载Visual C++ Build Tools 2015,地址:http://go.microsoft.com/fwlink/?LinkId=691126
文件名为:visualcppbuildtools_full.exe
2、双击安装该exe
如果中间出现:安装包丢失或损环,一般情况下这种安装方式都会报错,需要进行下面步骤
3、下载完整版
则需要下载:solved_packageMissInInstalling_mu_visual_cpp_build_tools_2015_update_3_x64_dvd_dfd9a39c.iso,
地址:https://www.kdocs.cn/sharing/sharefolder
下载之后解压双击iso,再双击exe安装即可
报错2:error: command 'cl.exe' failed: No such file or directory
再次执行编译命令:
python py_to_pyd.py build_ext --inplace
提示:error: command 'cl.exe' failed: No such file or directory
出现这个错误,一般是从pycharm的命令行或者cmd或者powershell直接执行上面命令的,
执行这个命令需要从c++的命令窗口内执行,
找到Microsoft Visual C++ Build Tools安装目录,如我的:C:\Program Files (x86)\Microsoft Visual C++ Build Tools
- 对于 32 位 Python,请使用Visual C++ 2015 x86 Native Build Tools Command Prompt
- 对于 64 位 Python,使用Visual C++ 2015 x64 Native Build Tools Command Prompt
双击打开窗口,再执行命令,如 3.1 在windows下执行 步骤中的插图。
参考:
https://blog.csdn.net/kdongyi/article/details/102678595
https://blog.csdn.net/colleges/article/details/123769410 (报错1:Unable to find vcvarsall.bat)
https://stackoverflow.com/questions/41724445/python-pip-on-windows-command-cl-exe-failed(报错2:error: command 'cl.exe' failed: No such file or directory)