Cython加密多层目录中的Python脚本方案

近期有一个Vue+Java+Docker项目中需要加密Python脚本的需求,调研后决定采用Cython。

使用Cython编译为二进制

步骤

  1. 安装Cython:pip install cython
  2. 创建setup.py:
from distutils.core import setup
from Cython.Build import cythonizesetup(ext_modules=cythonize("your_script.py"))
  1. 编译:python setup.py build_ext --inplace

使用Cython加密多层目录中的Python脚本方案

针对多目录Python项目,下面提供了一个完整的Cython加密方案,包括批量处理脚本和Docker集成方法。

1. 项目结构准备

假设您的项目结构如下:

project/
├── scripts/
│   ├── module1/
│   │   ├── __init__.py
│   │   ├── utils.py
│   │   └── processor.py
│   ├── module2/
│   │   ├── __init__.py
│   │   └── analyzer.py
│   └── main.py
├── run.sh
└── Dockerfile

2. 批量加密脚本

创建build_cython.py脚本来自动处理多目录加密:

import os
import glob
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extensiondef scan_python_files(base_path):py_files = []for root, _, _ in os.walk(base_path):py_files.extend(glob.glob(os.path.join(root, "*.py")))return [f for f in py_files if not f.endswith('__init__.py')]def create_extensions(py_files):extensions = []for py_file in py_files:module_path = py_file.replace('.py', '').replace('/', '.')extensions.append(Extension(module_path, [py_file]))return extensionsif __name__ == "__main__":base_dir = "scripts"  # 您的Python脚本目录py_files = scan_python_files(base_dir)extensions = create_extensions(py_files)setup(ext_modules=cythonize(extensions,compiler_directives={'language_level': "3",'always_allow_keywords': True},build_dir="build"))# 生成后的.so文件会保留原始目录结构

3. 构建和清理脚本

创建build.sh脚本:

#!/bin/bash# 1. 安装依赖
pip install cython# 2. 编译Python文件
python build_cython.py build_ext --inplace# 3. 清理中间文件
find . -name "*.py" ! -name "__init__.py" ! -name "setup.py" -type f -delete
find . -name "*.c" -type f -delete
rm -rf build# 4. 修改权限
find . -name "*.so" -exec chmod 755 {} \;

4. Dockerfile集成

# 构建阶段
FROM python:3.9-slim as builderWORKDIR /app
COPY . .RUN apt-get update && \apt-get install -y gcc python3-dev && \pip install cython && \chmod +x build.sh && \./build.sh# 运行阶段
FROM python:3.9-slimWORKDIR /app
COPY --from=builder /app /app# 确保.so文件有执行权限
RUN find /app -name "*.so" -exec chmod 755 {} \; && \# 删除可能残留的.py文件find /app -name "*.py" -type f -delete && \# 安装运行时依赖pip install -r requirements.txt# 确保shell脚本可以执行
RUN chmod +x run.shCMD ["./run.sh"]

5. Shell脚本调用适配

修改您的run.sh,确保它能找到.so文件而不是.py文件:

#!/bin/bash# 原来的调用方式可能是: python scripts/main.py
# 修改为:
PYTHONPATH=/app python -c "from scripts import main; main.main()"

6. 特殊处理

  1. __init__.py处理

    • 保留目录中的__init__.py文件
    • 确保它们为空或只包含必要导入
  2. 动态导入问题
    如果有动态导入(如importlib.import_module),需要预先生成所有可能的.so文件

  3. 第三方依赖
    确保在Docker中安装了所有Python依赖

7. 验证步骤

  1. 本地测试:

    ./build.sh
    python -c "from scripts.module1.processor import some_function; some_function()"
    
  2. Docker测试:

    docker build -t py-encrypted .
    docker run py-encrypted
    

注意事项

  1. 调试困难:加密后难以调试,建议保留开发环境的未加密副本

  2. 版本兼容性:生成的.so文件与Python版本和操作系统相关,确保构建和运行环境一致

  3. 性能影响:首次加载.so文件可能比.py稍慢,但运行时性能更好

  4. 不完全加密:Cython并非完全不可逆向,但对大多数场景已足够安全

这个方案将您的所有Python脚本(除了__init__.py)转换为.so二进制文件,同时保持原始目录结构,确保您的shell脚本可以继续正常工作。

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

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

相关文章

力扣DAY40-45 | 热100 | 二叉树:直径、层次遍历、有序数组->二叉搜索树、验证二叉搜索树、二叉搜索树中第K小的元素、右视图

前言 简单、中等 √ 好久没更了,感觉二叉树来回就那些。有点变懒要警醒,不能止步于笨方法!! 二叉树的直径 我的题解 遍历每个节点,左节点最大深度右节点最大深度当前节点当前节点为中心的直径。如果左节点深度更大…

头歌数据库【数据库概论】第10-11章 故障恢复与并发控制

第1关:数据库恢复技术 1、事务的( A)特性要求事务必须被视为一个不可分割的最小工作单元 A、原子性 B、一致性 C、隔离性 D、持久性 2、事务的(C )特性要求一个事务在执行时,不会受到其他事务的影响。 A、原…

windows下,cursor连接MCP服务器

1.下载并安装node 安装后,在cmd命令框中,输入命令node -v可以打印版本号,证明安装完成 2.下载MCP服务器项目 在MCP服务器找到对应项目,这里以server-sequential-thinking为例子 在本地cmd命令窗口,使用下面命令下载…

前端配置husky,commit-lint导致的git提交错误:git xx@0.0.0 lint:lint-staged

前端配置husky,commit-lint导致的git提交错误:git xx0.0.0 lint:lint-staged git commit -m "xxx"时出现以下报错,可能是前端配置husky,commit-lint的原因 //报错信息 git xx0.0.0 lint:lint-staged首先要知道出现这个错…

各种场景的ARP攻击描述笔记(超详细)

1、ARP报文限速 上一章我们说过ARP报文也是需要上送CPU进行处理的协议报文,如果设备对收到的大量ARP报文全部进行处理,可能导致CPU负荷过重而无法处理其他业务。因此,在处理之前需要对ARP报文进行限速,以保护CPU资源。 1.根据源MAC地址或源IP地址进行ARP限速 当设备检测到某一…

Django 创建CSV文件

Django使用Python内置的CSV库来创建动态的CSV(逗号分隔值)文件。我们可以在项目的视图文件中使用这个库。 让我们来看一个例子,这里我们有一个Django项目,我们正在实现这个功能。创建一个视图函数 getfile() 。 Django CSV例子 …

HTTPS为何仍有安全漏洞?解析加密协议下的攻击面

本文深度剖析HTTPS协议在传输层、证书体系、配置管理三个维度的安全盲区,揭示SSL/TLS加密掩盖下的11类攻击路径。基于Equifax、SolarWinds等重大事件的技术复盘,提供包含自动化证书巡检、动态协议升级、加密流量威胁检测的立体防御方案。 HTTPS不等于绝…

MyBatis 动态 SQL 使用详解

&#x1f31f; 一、什么是动态 SQL&#xff1f; 动态 SQL 是指根据传入参数&#xff0c;动态拼接生成 SQL 语句&#xff0c;不需要写多个 SQL 方法。MyBatis 提供了 <if>、<choose>、<foreach>、<where> 等标签来实现这类操作 ✅ 二、动态 SQL 的优点…

乐观锁与悲观锁的使用场景

悲观锁的应用场景 悲观锁的基本思想是假设并发冲突会发生&#xff0c;因此在操作数据时会先锁定数据&#xff0c;直到完成操作并提交事务后才释放锁。这种方式适用于写操作较多、并发冲突可能性较高的场景。 高写入比例的数据库操作&#xff1a;如果系统中有很多写操作&#x…

cpp(c++)win 10编译GDAL、PROJ、SQLite3、curl、libtiff

cpp&#xff08;c&#xff09;编译GDAL、PROJ、SQLite3 Sqlite3libtiffcurlprojGDAL Sqlite3 1、下载 Sqlite3 源码、工具、二进制预编译 exe Sqlite3 官网&#xff1a;https://www.sqlite.org/download.html 下载 sqlite-amalgamation-3430200.zipsqlite-dll-win64-x64-3430…

【愚公系列】《高效使用DeepSeek》062-图书库存管理

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

链表算法中常用操作和技巧

目 1.常用技巧 1.1.画图 1.2.添加虚拟头节点 1.3.大胆引入中间变量 1.4.快慢双指针 1.4.1判断链表是否有环 1.4.2找链表中环的入口 ​2.常用操作 2.1. 创建一个新节点 2.2.尾插 2.3.头插 1.常用技巧 1.1.画图 画图可以让一些抽象的文字语言更加形象生动 画图&#…

【9】数据结构的串篇章

目录标题 串的定义顺序串的实现初始化赋值打印串求串的长度复制串判断两个串长度是否相等连接两个串比较两个串内容是否相等插入操作删除操作调试与代码合集 串的模式匹配算法朴素的模式匹配算法KMP算法实现模式匹配 串的定义 定义&#xff1a;由0个或多个字符组成的有限序列&…

GMSL Strapping Pins CFG0/CFG1 应用

GMSL device 使用起来还是比较简单 ADI 已经充分考虑了用户的需求&#xff0c;尽可能的降低的芯片的使用和配置复杂度 一对加串器和解串器&#xff0c;只要工作模式匹配得当&#xff0c;Link Locked&#xff0c;便能够正常工作 如果遇到 Link 无法建立&#xff08;Locked&…

`uia.WindowControl` 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式

uia.WindowControl 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系统的 UI 自动化框架(如 pywinauto 中的 uia 模块)里用于表示窗口控件的类。在 Windows 操作系统中,每个应用程序的窗口都可以看作是一个控件,ui…

Easysearch VS Opensearch 数据写入与存储性能对比

本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具&#xff1a;INFINI Loadgen 对比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 节点 JVM 配置…

力扣题解:142. 环形链表 II

在链表学习中&#xff0c;我们已经了解了单链表和双链表&#xff0c;两者的最后一个结点都会指向NULL&#xff1b;今天我们介绍的循环列表则不同&#xff0c;其末尾结点指向的这是链表中的一个结点。 循环链表是一种特殊类型的链表&#xff0c;其尾节点的指针指向头节点&#…

区间 dp 系列 题解

1.洛谷 P4342 IOI1998 Polygon 我的博客 2.洛谷 P4290 HAOI2008 玩具取名 题意 某人有一套玩具&#xff0c;并想法给玩具命名。首先他选择 W, I, N, G 四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好&#xff0c;将名字中任意一个字母用 W, I, N, G …

天基光学图像仿真原理简介

一、原理简介 天基光学图像仿真通过数学模型和算法模拟空间目标在光学系统中的成像过程&#xff0c;核心原理可归纳为以下四部分&#xff1a; 1. 目标与背景建模‌ 目标运动建模‌&#xff1a;利用轨道动力学模型&#xff08;如SGP4&#xff09;解析空间目标轨迹&#xff0c;…

Jetpack Compose 状态保存机制全面解析:让UI状态持久化

在Android开发中&#xff0c;Jetpack Compose 的状态管理是一个核心话题&#xff0c;而状态保存则是确保良好用户体验的关键。本文将深入探讨Compose中各种状态保存技术&#xff0c;帮助你在配置变更和进程重建时保持UI状态。 一、基础保存&#xff1a;rememberSaveable reme…