使用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)

posted @ 2022-07-28 19:45  秋寻草  阅读(3190)  评论(0编辑  收藏  举报