Cpython编译后再使用Pyinstaller打包

一、Cpython

Python是一门解释型语言,当我们想让其他人运行我们的代码时,如果直接将.py源代码发送给他人,那么源代码将没有任何安全性可言,也就是任何一个人都可以打开源代码一看究竟,任何人都可以随意修改源代码。

而为了防止源代码泄露,可以将Python源代码编译生成.pyd库文件或者.so库文件:Windows平台生成pyd文件,Linux生成so文件。

1.1 Python有以下几种类型的文件

py:Python控制台程序的源代码文件
pyw:Python带用户界面的源代码文件
pyx:Python包源文件
pyc:Python字节码文件(可通过逆向编译来得到源码)
pyo:Python优化后的字节码文件(可通过逆向编译来得到源码)
pyd:在Windows平台上Python的库文件(Python版DLL)
so:在Linux平台上Python的库文件是so文件

1.2 使用Cpython编译项目步骤

example:
hello.py

def say_hello():print("Hello!")
1.2.1 安装Cpython

pip3 install Cython

1.2.2 编写转换文件

setup.py

from setuptools import setup
from Cython.Build import cythonize# python3 setup.py build_ext --inplace# 所有需要编译的py文件
all_py_file = ['hello.py']setup(name="hello",ext_modules=cythonize(all_py_file),version="1.0",author="Leo",author_email="LeoLi.Li@groupm.com"
)
1.2.3 执行转换生成so文件

进入目录
在这里插入图片描述

执行:python3 setup.py build_ext --inplace
在这里插入图片描述
在这里插入图片描述

1.2.4 测试编译好的so文件

将py文件等相关编译文件删除
在这里插入图片描述

测试是否可以正常导入并使用hello.py的函数
在这里插入图片描述

1. 3yd/so文件反编译?

pyd/so文件是由 Cython首先把python源码翻译成了 .c文件(这个过程基本不可逆),再把这个.c文件编译成了pyd/so文件。

二、 Pyinstaller

pyinstaller是一个第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个 独立文件方便传递和管理。

Pyinstaller打包的可执行文件并不是跨平台的,而是希望在哪个平台上运行就需要在哪个平台上进行打包。

安装pyinstaller:

python3 -m pip install --no-cache-dir pyinstaller -i https://mirrors.aliyun.com/pypi/simple/;

2.1 使用pyinstaller打包 py文件

项目目录
在这里插入图片描述

main.py

from hello import say_helloif __name__ == '__main__':
say_hello()

打包

pyinstaller  --name say_hello --onedir --log-level WARN --strip --paths /leo/gme/pyinstaller_demo --distpath /leo/gme/pyinstaller_demo/package /leo/gme/pyinstaller_demo/main.py

执行打包后的可执行文件:
在这里插入图片描述

2.2 使用pyinstaller打包 Cpython编译后的so

Cpython可以将py编译成so文件,将编译好的so文件以原来的工程组织形式(module)存放好,注意module下要有非编译的__init__.py, 工程的main.py也不要编译

pyinstaller的打包过程会从main.py走一遍所有调用的module,并打包进去,但是编译好的pyd不会被识别import,这就是为什么要保留原来module的__init__.py, 对于这些已经编译为so的module,属于隐式import,需要在打包时加入–hidden-import

项目目录
在这里插入图片描述

main.py

from hello import say_helloif __name__ == '__main__':say_hello()

打包

pyinstaller   --hidden-import "hello" --name say_hello --onedir  --log-level WARN   --strip --paths /leo/gme/pyinstaller_demo --distpath /leo/gme/pyinstaller_demo/package   /leo/gme/pyinstaller_demo/main.py

执行打包后的可执行文件:
在这里插入图片描述

_internal 依赖的是so文件:
在这里插入图片描述

三、参考资料

Cpython编译:https://www.cnblogs.com/gcgc/p/16529975.html
Pyinstaller介绍:https://blog.csdn.net/weixin_45953322/article/details/128774685
Pyinstaller打包so文件 https://blog.csdn.net/weixin_39916966/article/details/130781599

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

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

相关文章

Linux(CentOS7.5):新增硬盘分区纪实

一、服务器概述 1、既有一块系统硬盘,新增一块100G硬盘。 2、要求,将新插入硬盘分为:20G、30G、50G。 二、操作步骤 1、确认新硬盘是否插入成功: fdisk -l# 红色框出来的,为识别出来的新硬盘信息 # 黄色框出来的&#…

idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 📜jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量&a…

【开源】基于Vue.js的高校大学生创业管理系统的设计和实现

项目编号: S 027 ,文末获取源码。 \color{red}{项目编号:S027,文末获取源码。} 项目编号:S027,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创…

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用?11.28晚八点虹科直播间为您揭晓!

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用?11.28晚八点虹科直播间为您揭晓! 什么是AR眼镜? AR眼镜,即增强现实眼镜,是一种结合虚拟信息与真实世界的创新医疗工具。 通过集成高科技传感器和实时数据处理技术&…

【Python】使用globals()函数成功解决tkinter多个新窗口问题

我在近期的一个项目(tkinter复刻记事本)上遇到一个很有意思的问题:如何在创建多个新窗口后,每个窗口还能独立运行?当时我尝试几种方法,奈何实力不足,于是便下定结论非使用线程不可,至…

通付盾Web3专题 | SharkTeam:起底朝鲜APT组织Lazarus Group,攻击手法及洗钱模式

国家级APT(Advanced Persistent Threat,高级持续性威胁)组织是有国家背景支持的顶尖黑客团伙,专门针对特定目标进行长期的持续性网络攻击。朝鲜APT组织Lazarus Group就是非常活跃的一个APT团伙,其攻击目的主要以窃取资…

JavaScript WebApi(二) 详解

监听事件 介绍 事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中,事件监听器可以用于捕获和响应用户与页面交互的各种操作,如点击、滚动、输入等。 事件监听的基本原理是,通过在特定元素上注册事件监听器,当事件…

免费SSL证书有效期只有90天?太短?

随着网络安全问题日益受到重视,SSL证书成为了网站安全的必需品。然而,在许多情况下,免费提供的SSL证书往往只有90天的有效期,这种期限对于很多用户来说显得过于短暂。 首先,我们要理解为什么 SSL 证书的有效期设定为90…

基于单片机DHT11湿度测量与控制-CO2-光照报警系统程序和仿真

一、系统方案 1、本设计采用这51单片机作为主控器。 2、DHT11温湿度、CO2、光照强度送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 //初始化LCD*********************************…

LCR 047. 二叉树剪枝 和 leetCode 1110. 删点成林 + 递归 + 图解

给定一个二叉树 根节点 root ,树的每个节点的值要么是 0,要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身,以及所有 node 的后代。 示例 1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1] 解释: 只有红…

Nvidia VPI 双目相机生成深度图

nVidia VPI(Vision Programming Interface)提供了多种后端,用于执行图像处理和计算机视觉操作。不同的后端针对不同的硬件和用例进行了优化。这些后端包括: 1. CPU: 这是最通用的后端,它运行在标准的中央处理器&#…

【深度学习笔记】04 概率论基础

04 概率论基础 概率论公理联合概率条件概率贝叶斯定理边际化独立性期望和方差模拟投掷骰子的概率随投掷次数增加的变化 概率论公理 概率(probability)可以被认为是将集合映射到真实值的函数。 在给定的样本空间 S \mathcal{S} S中,事件 A \m…

Intellij Idea 断点小圆变成灰色怎么处理

场景1:变成了灰色实心圆 原因 断点变成灰色通常表示该断点处于失效状态。这可能是由于无意中点击了debug调试下方的“mute breakpoints”按钮导致的。 解决方案 依次点击设置小图标->View Options->Mute BreakPoints. 点击后 Mute BrakPoints左侧显示✔ 符号…

python之pyqt专栏5-信号与槽1

在上一篇文章,我们了解到如果想要用代码改变QLabel的文本内容,可以调用QLabel类的text()函数。 但是现在有个这样的需求,界面中有一个Button与一个Label,当点击Button时,将Label的内容改变为“Hello world!…

【兔子王赠书第9期】ChatGPT进阶:提示工程入门

文章目录 写在前面ChatGPT推荐图书关键点编辑推荐内容简介推荐理由 粉丝福利写在后面 写在前面 人类一直在寻找、制造并使用工具,以扩展我们的能力,适应我们的环境,甚至超越我们的生物限制。现在,我们正站在一个历史性的分水岭之…

Jetpack Compose中适应性布局的新API

Jetpack Compose中适应性布局的新API 针对大屏幕优化的新组合件。 使用新的Material适应性布局,为手机、可折叠设备和平板电脑构建应用程序变得更加简单!市场上各种不同尺寸的Android设备的存在挑战了构建应用程序时对屏幕尺寸的通常假设。开发者不应该…

c4d三维动画制作推荐 Cinema 4D 2024 中文for mac

功能介绍 场景管理器 Cinema 4D新内核的强大功能让您可以使用灵活的基于节点的资产来实现程序化的几何体创建、克隆等。 烟火 从Cinema 4D的任何物体或样条发射火焰、烟 雾和爆炸-加热! 建模 引入用于重新拓扑的 ZRemesher、新的交互式建模工具、高级样条节点、对…

03_歌词滚动效果

03_歌词滚动效果 文章目录 03_歌词滚动效果效果一、数据准备①:歌词②:音频等 二、代码实现①:首页②:样式③:js逻辑④:测试 效果 一、数据准备 ①:歌词 var lrc [00:00.95]夜微凉 - 徐珊 [0…

Glare or Gloom, I Can Still See You – End-to-End Multi-Modal Object Detection

SENSOR-AWARE MULTI-MODAL FUSION G-log(-log(U)),U~Uniform[0,1] 辅助信息 作者未提供代码

【解决方案】安科瑞智能照明系统在福建二建大厦项目上的研究与应用

【摘要】:智能化已经成为当今建筑发展的主流技术、涵盖从空调系统、消防系统到安全防范系统以及完善的计算机网络和通信系统。但是长期以来、智能照明在国内一直被忽视、大多数建筑物仍然沿用传统的照明控制方式、部分智能大厦采用楼宇自控(BA&#xff0…