python算法加密 pyarmor与docker

news2024/11/17 16:35:20

如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀!关注、点赞、收藏、评论。

目录

  • 一、 基本语法 加密 Python 脚本
    • 二、运行加密脚本
      • 三、pyarmor&docker
      • 3.1 Dockerfile
      • 3.2 requirements.txt
      • 3.3 加密函数lock_by_pyarmor.py
      • 3.4 主函数myprocessor.py
      • 3.5 创建镜像并验证效果

一、 基本语法 加密 Python 脚本

a) 单个包,只有单级目录

使用命令obfuscate来加密 python 脚本。在最简单的情况下,最常用的一种情况是切换到主函数脚本algorithm.py所在的路径,然后执行:

pyarmor obfuscate algorithm.py

在这里插入图片描述
PyArmor 会加密 algorithm.py 和相同目录下面的所有 *.py 文件:

  • 创建输出子目录 dist
  • 生成加密的主脚本 algorithm.py 保存在输出目录 dist
  • 加密相同目录下其他所有 *.py 文件,保存到输出目录 dist
  • 生成运行加密脚本所需要的全部辅助文件,保存到输出目录 dist
    在这里插入图片描述
    b) 若有多个算法包、多级目录

默认情况下,只有和主脚本相同目录的其他 *.py 会被同时加密。如果想递归加密 子目录下的所有 *.py 文件,使用下面的命令:

pyarmor obfuscate --recursive algorithm.py

注意:只能加密.py文件,如果算法需要调用.csv,.json文件,直接拷贝到dist文件夹对应的包里就可以了

在这里插入图片描述

二、运行加密脚本

运行加密脚本不需要安装pyarmo

cd dist

python algorithm.py

发布加密脚本

执行到这一步已经可以发布加密脚本了,发布加密脚本只需要把输出路径的所有dist文件拷贝即可。

三、pyarmor&docker

由于pyarmo加密的脚本对运行环境比较敏感,因此我们最好把整个算法打包成镜像,在启动容器的时候进行加密,并删除所有的未加密文件,留下dist文件

注:上文也说过,pyarmo只能对.py文件加密,对于.csv,.json文件是无法加密的,自然在生成的dist包里也没有非.py后缀的文件,因此我们需要将.csv等文件移入到dist里,不然运行dist里的算法时会报错。

由于我本地是windows系统,所以生成.dll后缀文件,直接把dist制作成镜像会报错,因为容器运行需要.so文件,因此考虑在容器中运行时加密,生成.so,再自动移除未加密文键,只留下dist及所需的非.py后缀文件,其实也可以用linux系统直接本地运行生成dist,但是不要忘记将非.py后缀的文件及文件夹复制进去。

下面将以myprocessor的算法包为例,讲述整个流程:
在这里插入图片描述

可以看出,里面是多个算法包互相调用的,且有较多的非.py文件

3.1 Dockerfile

FROM python:3.6 # 导入python3.6基础环境
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\
  && echo 'Asia/Shanghai'>/etc/timezone # 同步系统时间
COPY ./ ./app/ # 将算法里面的所有文件和文件夹复制到镜像里
WORKDIR /app/ # 设置镜像里的app为主文件夹
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 将算法需要的包在镜像中进行安装
Python学习交流群:748989764
RUN pyarmor obfuscate --recursive myprocessor.py # 对所有算法递归加密
RUN ls # 显示app内的所有文件
CMD ["python3","/app/dist/myprocessor.py"] # 运行dist内的加密后的主函数

3.2 requirements.txt

# 这里就是运行我的算法依赖的模块,pyarmor==7.4.2一定要加,其他的根据自己的算法依赖添加
pyarmor==7.4.2
pandas == 1.1.5
numpy == 1.19.5
requests == 2.25.1

3.3 加密函数lock_by_pyarmor.py

# -*- coding: utf-8 -*- 
import shutil
import os
class File_lock():
    def __init__(self):
        self.root_path = os.getcwd()  # 当前工作路径

    def remove_and_del_unsecret_dir_f(self):
        '''移除未加密的py和pyc文件,复制非py,pyc文件到dist'''
        for root, dir, files in os.walk(self.root_path):
            if "dist" not in root:
                for file in files:
                    if os.path.splitext(file)[-1] in ['.py', '.pyc']:
                        # 删除所有未加密的.py和.pyc文件
                        os.remove(os.path.join(root, file))
                    else:
                        # 由于非py文件无法加密,因此将非py文件移动到同名文件夹下,若找不到同名文件夹就创建同名文件夹
                        if root == self.root_path:
                            dist_same_die_path = os.path.join(self.root_path, 'dist')
                        else:
                            dist_same_die_path = os.path.join(self.root_path, 'dist', os.path.basename(root))
                        if not os.path.exists(dist_same_die_path):
                            os.mkdir(dist_same_die_path)
                        shutil.move(os.path.join(root, file), dist_same_die_path)

        temp_list = os.listdir() # 移除dist外的所有空文件夹
        temp_list.remove('dist')
        for i in temp_list:
            os.rmdir(i)

    def lock_by_pyarmor(self):
        # print("当前工作路径:",self.root_path)
        # print("os.listdir", os.listdir())
        if (not os.path.exists(os.path.join(self.root_path, "dist"))):  # 若dist不存在
            os.system("pyarmor obfuscate --recursive myprocessor.py")  # 加密
            self.remove_and_del_unsecret_dir_f()
        else:
            # print("加密后文件夹:",os.listdir())
            self.remove_and_del_unsecret_dir_f()
            # print("移除未加密文件后:",os.listdir())

3.4 主函数myprocessor.py

from lock_by_pyarmor import File_lock
def call(arg, model, *args, **kwargs):
    lockf = File_lock()
    lockf.lock_by_pyarmor()
    from deviation_algothrim.get_deviation import Deviation
    from loss_power.get_loss_power import GetPower
    pass
if __name__ == "__main__":

    print(call(arg=None, model=None))

注意:从其他包里导入需要的内容,需要放到lockf.lock_by_pyarmor()之后,不然,还没有完全构建成dist文件,可能会调用报错。

3.5 创建镜像并验证效果

docker build _t imag1 .建立完镜像后,app内目录为:

在这里插入图片描述

  • docker run -d imag1 /bin/bash -c “tail -f /dev/null”
  • docker ps #找到正在运行的容器id
  • docker exec -it 2293ee92f3ca /bin/bash # 进入容器
  • python /app/dist/myprocessor.py # 执行加密文件

在这里插入图片描述

在这里插入图片描述
可以看到app内只剩下了dist文件。
最后需要将启动的容器重新打包成镜像,并发布到harbor上:docker commit 2293ee92f3ca7 new_image,丢弃原本的镜像。因为原本镜像中是有未加密文件的,并且可以访问 。
可以将容器里的加密文件导出到本地D盘: docker cp bf5f2e815b64:/app D:/

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

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

相关文章

元宵节营销活动策划,轻松拿下用户

热闹的春节刚过,又将迎来团圆美满的元宵节🏮。我们今天就来讲讲,关于节日营销的小巧思! 【产品游戏】 在每一个关于节日的营销里,将游戏作为切入点与产品相结合,往往可以获得意想不到的效果。对于场景单一…

DynaSLAM-6 DynaSLAM论文解读

目录 1.论文摘要解读 1.1 原论文内容 1.2 个人理解 2.论文discusses related work部分 2.1 原论文内容 3.论文SYSTEM DESCRIPTION部分 3.1 使用Mask R-CNN对潜在的动态内容进行分割 3.2 低成本追踪 3.3 使用Mask R-CNN和多视角几何对动态内容进行分割 3.4 跟踪线程…

分享会上狂吹MySQL的4大索引结构红黑树、二叉树B+Tree,没想到~~~~

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高…

品优购网页制作

目录 favicon图标 TDK三大标签SEO优化 title网站标题 description网站说明 keywords关键字 首页制作 快捷导航模块 左浮动 右浮动 header头部模块制作 1.logo模块 2.search模块 3.热词模块 4.购物车模块 子绝父绝 nav导航模块 1.nav左边导航位置 2.上方导航位置 …

PCB覆铜很“上头”?一文帮你搞定实操要点和规范

1、覆铜覆盖焊盘时,要完全覆盖,shape 和焊盘不能形成锐角的夹角。2、尽量用覆铜替代粗线。当使用粗线时,过孔通常为非通常走线过孔,增大过孔的孔径和焊盘。修改后:3、尽量用覆铜替换覆铜走线的模式,后者常常…

11.深度优先搜索

一、算法内容 1.简介 深度优先搜索DFS(Depth First Search)按照深度优先的方式进行搜索,可以理解为“一条路走到黑”地穷举所有可行的方案,并不断尝试,直到找到一种情况满足问题问题的要求。那么这个方案就是一个问题…

shell 循环学习练习

目录 一,嵌套循环实现9*9乘法表 二,判定一个成绩: 三,循环创建用户:用户名为user01-user20 一,嵌套循环实现9*9乘法表 (for和while都可以) 选做:格式对齐,以及使用单层循环完成9*9乘…

精细管理——CRM销售漏斗管理

CRM销售漏斗涵盖了从接触客户到谈判、成单、回款的整个销售过程。一个典型的销售漏斗是由一个特定时间段里,例如一年或者一个季度或者一个月这个时间范畴之内,一系列有可能转化成订单的潜在销售机会所组成。在CRM客户管理系统中,销售漏斗管理…

Unity-TCP-网络聊天功能(四): 消息粘包、心跳机制保活(心跳包)、断线重连

8. 粘包Bug、心跳机制保活(心跳包)、断线重连粘包bug1:下线后,如果发送多条消息,在客户端上线时,一瞬间接收到,效果如同粘包,需要拆包。举例,连续发送三条160长度消息,可能实际显示2…

java常用类: System类直接常用方法

java常用类型: Ineteger等包装类 String类,StringBuffer类和StringBuilder类 Math类及常用方法 System类及常用方法 Arrays类及常用方法 BigInteger类和BigDecimal类及常用方法 日期类Date类,Calender类和LocalDateTime类 文章目录System简介System.exit(0) 退出Sys…

蓝桥杯重点(C/C++)(随时更新,更新时间:2023.2.2)

点关注不迷路,欢迎推荐给更多人,大约两天更新一次,建议点赞收藏加关注 本次更新内容:1.STL部分详细讲述,放到一篇新的文章中 2. 部分细节优化 目录 1 技巧 1.1 取消同步(节约时间,甚至能多…

Shield UI for JavaScript 1.7.44 Crack

Shield UI for JavaScript Shield UI JavaScript 框架提供具有响应式设计的 JavaScript HTML5 组件,这些组件经过优化以获得最佳性能。 Shield UI 在 70 多种小部件类型中提供了最快和高度可定制的网格和图表控件。每个单独的控件都由行业领先的 24/7 支持包提供支持…

以莫罗湾为例,利用高精度地形高程模型应对海岸环境变化

Morro Bay是位于加州 San Luis Obispo附近的浅海河口区,存在大量野生动物,也是人们户外活动的好去处。但是沉积变化和鳗草(大叶藻)的大量消失对河口景观产生了不利影响。为了更好地认识环境改变的路径并提取修复对策,M…

2023年山东最新建筑八大员(资料员)考试试题题库及答案

百分百题库提供建筑八大员(资料员)考试试题、建筑八大员(资料员)考试预测题、建筑八大员(资料员)考试真题、建筑八大员(资料员)证考试题库等,提供在线做题刷题,在线模拟考…

Vue实战第3章:主页设计之顶部导航栏

主页设计之顶部导航栏 前言 本篇在讲什么 本篇文章主要来制作一个导航栏,具体效果就按照下图来处理吧 本篇适合什么 适合初学Vue的小白 想了解建站的同学 本篇需要什么 对Html语法有简单认知 对CSS语法有简单认知 对Vue有简单认知 依赖VS Code编辑器 本…

【redis6】第十三章(主从复制)

是什么 主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 能干嘛 读写分离,性能扩展 容灾快速恢复 怎么玩 拷贝多个redis.conf文件include(写绝对路径) 开启daemonize yes Pi…

连接mysql5.7错误1045,重新设置root用户密码,已经springboot连接配置

错误: ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: NO) 原因是: 是因为数据库中用户密码的问题。所以我们可以跳过数据权限验证,重新设置一下 一、修改my.ini配置文件 停止mysql服务 方法&#xff…

GJB 5000B二级-PMC项目监控

一、主要变化情况 新增2项(红色)、拆分3项(蓝色)、移除2项(黄色)、合并9项(绿色) 新增的主要内容-2项 增加多资源计划的监控要求:   军用软件系统具体设备间联系紧密,测试验证环节多、要求高等特点,其研发和测试需要众多软硬件资源支持,而这些资源往往是影响…

ConcurrentHashMap1.7和1.8的不同实现

ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap,为了对更深入的了解,本文将对JDK1.7和1.8的不同实现进行分析。 J…

FreeRTOS中断管理 | FreeRTOS五

目录 说明: 一、中断基础 1.1、中断理解 1.2、中断执行步骤 1.3、中断寄存器选择位 1.4、中断优先级分类 二、中断优先级分组设置 2.1、分类 2.2、特点 三、中断有关寄存器 3.1、SHPR1寄存器 3.2、SHPR2寄存器 3.3、SHPR3寄存器 3.4、FreeRTOS中配置Pe…