cython编译加密python源码

news2024/11/25 2:34:30
场景
python的解释特性是将py编译为独有的二进制编码pyc 文件,然后对pyc中的指令进行解释执行,但是 pyc的反编译却非常简单,可直接反编译为源码,当需要将产品发布到外部环境的时候,源码的保护尤为重要。

一、Cpython介绍

Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被Python调用,既具备了Python快速开发的特点,又可以让代码运行起来像C一样快,同时还可以方便地调用C library。
Cython是属于python的超集,用于编写python的c扩展语言
  
pyx文件由 Cython 编译为.c文件,包含 python 扩展模块的代码。.c文件由 C 编译器编译为.so文件(或 Windows 上的.pyd)。
生成的.so文件或pyd文件是D语言(C/C++综合进化版本)生成的二进制文件,理论上很难反编译。

Note: 纯python源码被cython编译后,因为没有使用类型标注等cython语法,故编译后的动态链接库和可执行文件,主要依赖python的运行时,并不依赖C/C++运行时,主要由python解释器执行,多线程GIL的问题同样存在,性能提升有限,但对for循环、大的列表对象遍历性能有明显优化效果。
优势:资源丰富,适合快速开发。翻译成C后速度比较快
缺陷:无法支持JIT技术(导致纯python的执行速度比JAVA、JAVASCRIPT等要慢,于是有了PyPy)

二、安装

# 安装cython
pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple cython
# 安装c编译器(linux需安装python-devel, gcc
centos: yum install python-devel  gcc
ubuntu: apt-get install build-essential

三、使用方法

先用cython将python语言代码转换为c语言代码,然后用c编译器(gcc)生成可执行文件或动态链接库
   
通过 shell 或  python脚本的方式 ,将项目启动的入口py编译成可执行文件,将项目的其他.py文件编译成.so(__init__.py除外)
Note: __init__.py文件定义了python的包结构, 为了使cython编译后的.so 能按照正常路径import,__init__.py不能被编译 ,故为了保护代码,整个项目的所有__init__.py文件不建议放业务相关代码。
  

3.1、单个文件的编译示例-linux

目录结构如下:
test/
├── test.py
├── main.py
test.py:
def hello():
    print('hello!')
main.py:
#!/usr/bin/python3.8
from test import hello

if __name__ == "__main__":
    hello()

3.1.1、将启动main.py编译成二进制可执行文件main

# 可通过文件头的 #!/usr/bin/env python 标记是否程序启动文件
   
>>>python3版本下#!/usr/bin/python3.8
main.py ---> main.c ---> main.o ---> main
# step1: python代码翻译成c代码(main.py -> main.c
cython -D -3 --directive always_allow_keywords=true --embed main.py
    
# step2: c代码编译为目标文件(main.c -> main.o
gcc -c main.c -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main.o
   
# step3: 将目标文件编译为二进制可执行文件(main.o -> main
gcc main.o -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main
main.py ---> main.c ---> main
# step1: python代码翻译成c代码(main.py -> main.c
cython -D -3 --directive always_allow_keywords=true --embed main.py
      
# step2: 将c代码编译为二进制可执行文件(main.c -> main
gcc main.c -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o main

3.1.2、将test.py编译为动态链接库test.so

>>>python3版本下test.py ---> test.c ---> test.so
# step1: python代码翻译成c代码(test.py -> test.c
cython -D -3 --directive always_allow_keywords=true test.py
    
# step2: c代码编译为linux动态链接库文件(test.c -> test.so
gcc test.c -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I /usr/include/python3.8 -L /usr/bin -lpython3.8 -o test.so
cython参数说明:
-D, --no-docstrings, Strip docstrings from the compiled module.

-o, --output-file <filename>   Specify name of generated C file
-2                             Compile based on Python-2 syntax and code semantics.
-3                             Compile based on Python-3 syntax and code semantics.
gcc参数说明:
-shared:
编译动态库时要用到

-pthread:
在Linux中要用到多线程时,需要链接pthread库

-fPIC:
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

-fwrapv:
它定义了溢出时候编译器的行为——采用二补码的方式进行操作

-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的
-O2:
会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
-O3: 在O2的基础上进行更多的优化

-Wall:
编译时 显示Warning警告,但只会显示编译器认为会出现错误的警告

-fno-strict-aliasing:
“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。

-I (大写的i):
是用来指定头文件目录
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

-l:
-l(小写的 L)参数就是用来指定程序要链接的库,-l参数紧接着就是库名,把库文件名的头lib和尾.so去掉就是库名了,例如我们要用libtest.so库库,编译时加上-ltest参数就能用上了

3.2、单个文件的编译示例-windows

windows系统使用cython需要确保 已安装C/C++编译器且环境变量正确配置,cython能找到编译器。windows系统可使用MSVC(Microsoft Visual C/C++)或者clang编译器。
    
将test.py编译为动态链接库test.pyd:
>>>python3版本下test.py ---> test.c ---> test.pyd
# step1: 将python代码翻译成c代码(test.py -> test.c)
cython -D -3 --directive always_allow_keywords=true test.py
    
# step2: 将c代码编译为windows动态链接库文件(test.c -> test.pyd)
cythonize -i test.c
最后得到windows下的动态链接库文件test.cp39-win_amd64.pyd,还需要将文件名重命名为test.pyd。
cythonize参数说明:
-b, --build     build extension modules using distutils
-i, --inplace   build extension modules in place using distutils(implies -b),即将编译后的扩展模块直接放在与test.py同级的目录中。

四、python编译可执行文件与动态链接库

五、参考

(8条消息) python性能优化和源码保护-编译整个项目_python编译当前项目_pushiqiang的博客-CSDN博客
(2条消息) gcc编译_青霄的博客-CSDN博客
Cython: C-Extensions for Python
Cython的简单使用 - 小得盈满 - 博客园 (cnblogs.com) 
cython编译的so和c语言编译的so本质上有什么区别? - 知乎 (zhihu.com)
github: 使用Cython编译整个python项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java程序设计入门教程--标识符和关键字

目录 标识符 标识符的约定 标识符 1. 定义 用来标识类名&#xff0c;变量名&#xff0c;方法名&#xff0c;类型名&#xff0c;数组名&#xff0c;文件名的有效序列称为标识符。简单地说&#xff0c;标识符就是一个名字。 2. 标识符命名规则 &#xff08;1&#xff09;大小…

Tuxera for Mac2023中文版读写硬盘U盘工具

在日常生活中&#xff0c;我们使用Mac时经常会遇到外部设备不能正常使用的情况&#xff0c;如&#xff1a;U盘、硬盘、软盘等等一系列存储设备&#xff0c;而这些设备的格式大多为NTFS&#xff0c;Mac系统对NTFS格式分区存在一定的兼容性问题&#xff0c;不能正常读写。 那么什…

算法|1.二分及其扩展

算法|1.二分及其扩展 1、有序数组中找到num 题意&#xff1a;给定有序数组&#xff0c;在有序数组中找到指定数字&#xff0c;找到返回true&#xff0c;找不到返回false. 解题思路&#xff1a; 数组有序查找指定元素使用二分法L指针初始值设为0&#xff0c;R指针初始值设为…

chatgpt赋能python:Python修改配置文件内容

Python 修改配置文件内容 介绍 配置文件是软件开发中经常使用的一种文件&#xff0c;用于存储程序的配置参数。在实际开发中&#xff0c;我们经常需要修改配置文件内容来满足我们的需求。Python 提供了很多方法来操作配置文件&#xff0c;让我们能够方便地修改配置文件。 本…

camunda如何部署到容器云Kubernetes

部署Camunda到Kubernetes需要以下步骤&#xff1a; 1、将Camunda打包成Docker镜像。 2、在Kubernetes中创建一个Deployment对象&#xff0c;用于定义Camunda应用程序的副本数量、容器镜像、环境变量、卷挂载等信息。例如&#xff0c;可以使用以下命令创建一个Deployment&…

镜像二叉树和求二叉树最大深度(java)

镜像二叉树和求二叉树最大深度 镜像二叉树。有些题目叫翻转二叉树。是同一个题。二叉树的最大深度 镜像二叉树。有些题目叫翻转二叉树。是同一个题。 题目描述&#xff1a;给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例&#xff1…

从Redisson的RedissonSemaphore引发的信号量实际含义的思考

Semaphore到底该如何使用 事情的起因是最近在看redisson的源码&#xff0c;刚好看到了RedissonSemaphore的acquire/release实现。 public RFuture<Void> releaseAsync(int permits) {if (permits < 0) {throw new IllegalArgumentException("Permits amount ca…

微信小程序 基础模板引入sass的两种方法

推荐使用第二种方法 一、VSCode扩展引入&#xff08;旧&#xff09; 1.vscode搜索扩展 Easy Sass安装 2.微信开发者工具导入vscode安装的所有扩展 3.修改sass扩展配置 打开扩展目录 找到刚导入的sass扩展 打开package.json文件 改成这样 保存 4.重新打开此项目 配置完事 5.使…

torch.distributed.launch多卡多机

torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.distributed.launch 可以通过命令&#xff0c;来打印该模块提供的可选参数 python -m torch.distributed.launch --help usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]…

Flutter_环境配置

FlutterSDK 下载FlutterSDK管理工具<SideKick>下载安装<SideKick>下载FlutterSDK设置全局SDK 修改Flutter配置文件获取全局SDK路径 验证配置是否成功验证环境配置 下载FlutterSDK管理工具 下载安装 SideKick下载链接 下载FlutterSDK 打开 SideKick选择需要的SD…

基于Python/MATLAB长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

目录 专题一、长时序遥感产品在全球变化/植被变绿/植被物候等方面的应用 专题二、MODIS遥感数据产品预处理 专题三、长时序MODIS遥感数据产品时间序列重构 专题四、基于GIMMS 3g和MODIS NDVI构建更长时序遥感数据 专题五、植被物候提取与分析实践应用 专题六、植被变绿趋…

卷S人的166页精品Java面试手册,17大java面试系列专题让你全方位暴击大厂Java面试官!

你有面试机会了吗&#xff1f; 近期&#xff0c;肯定有很多小伙伴&#xff0c;投出去的简历HR基本上都是已读不回&#xff0c;甚至都没有任何回复&#xff0c;或者平台默认筛选&#xff0c;你的简历HR根本就看不到。 即使有些小伙伴简历通过&#xff0c;收到面试邀请了&#…

RestCloud荣膺广东省优秀软件产品奖,引领国内数据集成领域!

近日&#xff0c;“2022年广东软件风云榜”名单公布&#xff0c;“谷云ETL数据交换软件”凭借其在助力企业数字化转型升级过程中的卓越表现&#xff0c;荣获由羊城晚报报业集团、广东软件行业协会、广东省大数据协会联合颁发的“优秀软件产品和解决方案”奖。 数字化转型是推动…

【CCF- CSP 202104-2 邻域均值 二维数组前缀和满分题解】

代码思路&#xff1a; 本题如果直接用暴力求解的话只能得70分。 运用到了二维数组的前缀和&#xff0c;难点是如何求出二维数组的前缀和并计算出领域所有元素的和。 注意计算平均数的时候要保证精度相同&#xff0c;所有都要化为double型&#xff0c;否则会出错。 首先&…

探索商机,连接世界——第133届广交会买家信息帮你快速找到合适的客户

亲爱的商家和供应商们&#xff01;&#xff01; 您是否在寻找拓展市场和国际贸易的机会&#xff1f;你想找到合适的客户&#xff0c;推广你的产品和服务&#xff0c;取得更大的商业成功吗&#xff1f;那么&#xff0c;我们给你带来了一个难得的机会&#xff01; 随着第133届广…

【开源项目】Dynamic-Tp告警系统的源码解析

序言 【开源项目】Dynamic-Tp核心流程源码解读&#xff0c;继上回解读完DynamicTp这个开源项目的源码&#xff0c;觉得其中的告警机制也是十分精彩&#xff0c;如果能学会&#xff0c;用在自己的项目中&#xff0c;那才能说得上掌握了DynamicTp这个开源项目的源码理解的精髓。…

零碳光储 数能未来 | 全系光储产品实力吸睛,科士达精彩亮相SNEC 2023

5月24日&#xff0c;光伏行业最具影响力的全球性展会——“SNEC 2023”在上海盛大开幕。作为行业领先的全能方案供应商&#xff0c;科士达以“零碳光储 数能未来”为主题&#xff0c;携全系光储产品及解决方案重磅亮相。 展会现场&#xff0c;科士达展出的全系解决方案涵盖分布…

APACHE-ATLAS-2.1.0简介(三)

APACHE-ATLAS-2.1.0简介(一) APACHE-ATLAS-2.1.0简介(二) 写在前面 ATLAS为组织提供开放式的元数据管理和治理功能&#xff0c;用以构建其数据资产目录&#xff0c;对这些资产进行分类和管理&#xff0c;形成数据字典。 名词解释 元数据&#xff1a;就是用于描述数据的数据…

js实现PDF 预览和文件下载

在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能&#xff0c;PDF 类型文件的来源又包括 H5 移动端 和 PC 端&#xff0c;而针对这两个不同端的处理会有些许不同&#xff0c;下文会有所提及。 针对 PDF 预览 的文章不在少数&#xff0c;但似乎都没有提及可能遇到的问…

【Java-Crawler】SpringBoot集成WebMagic实现爬虫出现的问题集(一)

SpringBoot集成WebMagic实现爬虫出现的问题集&#xff08;一&#xff09; 一、SpringBoot集成WebMagic框架日志异常问题及解决方案二、使用 Firefox 驱动&#xff08;geckodriver&#xff09;三、设置WebMagic中site中的User-Agent&#xff08;避免反爬虫&#xff09; 一、Spri…