使用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下执行:

使用Cython对python代码编译

执行完生成文件:

使用Cython对python代码编译

其中say_hello.c是中间文件,不用关心,直接删除

say_hello.cp36-win_amd64.pyd 就是我们要的编译后文件,windows下生成的是pyd文件。

测试一下:

1、先删除say_hello.c和say_hello.py文件

2、测试编译后的包能否导入和调用文件中方法

使用Cython对python代码编译

测试完成,没有问题,可以将名称改为say_hello.pyd,也可以不改,经测试都能引入并调用。

3.2 Linux下执行

使用Cython对python代码编译

执行会生成:say_hello.cpython-36m-x86_64-linux-gnu.so

测试一下:

1、先删除say_hello.c和say_hello.py文件

2、测试编译后的包能否导入和调用文件中方法

使用Cython对python代码编译

测试完成,没有问题,可以将名称改为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

使用Cython对python代码编译

如果中间出现:安装包丢失或环损坏,一般情况下,本次安装会报告错误,需要执行以下步骤

[En]

If the middle appears: the installation package is missing or the ring is damaged, in general, this installation will report an error, and the following steps are required

使用Cython对python代码编译

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

使用Cython对python代码编译
  • 对于 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)

Original: https://www.cnblogs.com/gcgc/p/16529975.html
Author: 秋寻草
Title: 使用Cython对python代码编译

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/9941/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部