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

  • 相关阅读:
    聊聊“装箱”在CLR内部的实现
    Jenkins多环境持续集成架构实践
    .NET Core 学习资料精选:进阶
    .NET Core 学习资料精选:入门
    Docker 常用命令(.NET Core示例)
    Vistual Studio 安装、Sql Server 安装
    .NET项目迁移到.NET Core操作指南
    站点部署,IIS配置优化指南
    .NET Core开源:IIS集中化Web管理工具
    jenkins:一键回滚站点集群
  • 原文地址:https://www.cnblogs.com/gcgc/p/16529975.html
Copyright © 2020-2023  润新知