Python制作自己的软件安装包程序

2023-05-16

Python制作自己的软件安装包程序

我看现在网上给自己的Python程序制作安装包一般都是使用inno setup,于是我突然想到能不能自己编写安装包程序(想快速了解制作方法的直接跳到最后)
首先肯定是要把安装包程序和安装的内容放进同一个exe中,而要安装的内容毫无疑问,肯定要放到压缩包里,那把安装程序和压缩包捆绑到一起用copy /b 安装程序.exe+file.zip output.exe这个命令就好了,运行起来也是会直接运行exe的(顺序不能反)
那问题就是如何从exe里提取出zip了,现在就出现了两种方法:

  1. 通过读取exe头信息来确定exe文件大小,从而切割文件
  2. 通过读取压缩包头信息来确定压缩包位置,从而切割文件(zip格式头信息为PK,7z为7z)

第一种方法我进行了尝试exe文件头信息格式
那思路清晰了,只需要读取偏移量为2-3h和4-5h的数据在进行计算就可以了,代码也就是这个样子:

with open("output.exe","rb") as f:
    f.seek(2,0)
    remainder = int.from_bytes(f.read(2), "little")
    quotient = int.from_bytes(f.read(2), "little")
    print(remainder,quotient)
    print(quotient*512+remainder)

大家不用试了,失败的很成功
具体原因我没想出来,知道的大佬可以说一下
于是我就采用了第二种方法,不断识别字节信息来确定压缩包位置,代码如下(7z压缩包就把第四行改为) if f.read(1) == b"7" and f.read(1) == b"z":

with open(executable,"rb") as f:
    #f.seek(5000000,0)
    while True:
        if f.read(1) == b"P" and f.read(1) == b"K":
            break
    f.seek(f.tell()-2,0)
    zipdata = f.read()

这里我要解释一下,第四行不能写if f.read(2) == b"PK":啊,因为你无法确定P位于偶数位置,而由于Python的机制, f.read(1) == b"P"判断为假后这个and语句就一定为假,那么第二个判断就不会执行
大家还能看到我注释掉了一行代码,因为我发现这个代码执行速度很快,不需要跳过一段一定错误的数据(整个用时不足1秒)

制作过程如下

那接下来思路就明确了,代码奉上:

# -*- coding: utf-8 -*-
import zipfile
from subprocess import Popen
from sys import executable

with open(executable,"rb") as f:
    #f.seek(5000000,0)
    while True:
        if f.read(1) == b"P" and f.read(1) == b"K":
            break
    f.seek(f.tell()-2,0)
    zipdata = f.read()
with open("file.zip","wb") as f:
    f.write(zipdata)
with zipfile.ZipFile("file.zip") as f:
    f.extractall("temp")
Popen("start .\\temp\\main.exe",shell=True)

这里我没有做图形化,如果你想做就直接写就行了,Popen是用来调起你的软件的,不需要可以注释掉
写完封装成exe,然后用copy /b命令捆绑就行了
想添加自启动之类的用winreg操作注册表即可,详情自己百度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python制作自己的软件安装包程序 的相关文章

  • 发送Promise请求出现以下错误origin ‘null‘ has been blocked by CORS policy

    错误如下 Access to XMLHttpRequest at span class token string 39 http localhost 9090 data 39 span from origin span class toke
  • VB.net与VB6 调用Websocket功能的方法--Websocket For VB

    概述 Websocket 功能在现今的通信应用开发中越来越普遍 xff0c 因为Websocket的消息机制 xff0c 在应用程序进行即时通信时使用非常合适 xff0c 而且Websocket 是长连接方式 xff0c 比起以前的http
  • sql当前日期

    查询本周 从周一开始计算 1 7 从周日开始计算就删除1 7 SELECT FROM 表名 WHERE YEARWEEK date format 时间字段 39 Y m d 39 1 61 YEARWEEK now 7 查询当月 SELEC
  • 【乐视秒杀架构】每秒处理10万请求—数据库分库分表

    随着乐视硬件抢购的不断升级 xff0c 乐视集团支付面临的请求压力百倍乃至千倍的暴增 作为商品购买的最后一环 xff0c 保证用户快速稳定的完成支付尤为重要 所以在15年11月 xff0c 我们对整个支付系统进行了全面的架构升级 xff0c
  • 单点登录(SSO)

    单点登录概述 xff1a 多系统共存下 xff0c 用户在一处地方登录 xff0c 得到其他所有系统的信任 xff0c 无需再次登录 在前端用户点击登陆之后触发后端的登录接口 xff0c 用户名密码验证通过之后 xff0c 自动生成一个JW
  • 【超详细】Consul的安装的使用附多环境配置(傻瓜式教程)

    一 Consul概述 Consul 是 HashiCorp 公司推出的开源工具 xff0c 用于实现分布式系统的服务发现与配置 与其他分布式服务注册与发现的方案 xff0c Consul 的方案更 一站式 xff0c 内置了服务注册与发现框
  • 【IDEA报错总结】修改Java编译版本-maven工程

    Warning 21 17 java 从发行版 10 开始 xff0c 39 var 39 是受限制的本地变量类型 xff0c 无法用于类型声明 xff0c 也无法用作数组的元素类型 之前一直使用的JDK8 xff0c 这个项目因为需要用到
  • 建一个链表

    单独的一个类 public class LinkNode int val LinkNode next LinkNode int x val 61 x 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 判断数据类型的5种方法

    1 typeof 可以判断数据类型 xff0c 它返回表示数据类型的字符串 xff08 返回结果只能包括number boolean string function object undefined xff09 xff1b 可以使用type
  • 用python实现给女朋友自动发微信

    女朋友说上班都不回她微信 xff0c 于是给她安排一个定时自动发微信的功能 效果预览 实现过程 一 启动微信进程二 获取微信窗口在桌面的坐标三 发送消息1 鼠标依次点击打开聊天框2 输入发送内容 四 设置定时任务 一 启动微信进程 正常情况
  • 7. STM32——定时器中断(1秒闪烁灯)

    STM32 定时器中断 xff08 1秒闪烁灯 xff09 基本框架1 配置定时器时钟在 stm32f10x rcc h 头文件中查找相关函数函数 2 配置定时器结构体在 stm32f10x tim h 头文件中查找相关函数函数 3 开启定
  • 10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶)

    STM32 PWM 控制舵机 通用定时输出PWMPWM的工作原理PWM的模式TIM OCMode PWM1 xff08 边沿对齐模式 xff09 TIM OCMode PWM2 xff08 中央对齐模式 xff09 占空比 舵机实物图接线舵
  • Windows10下Vmware开机蓝屏解决办法,亲测有效

    前言 虚拟机蓝屏的原因有很多 xff0c 这里我结合了网上的方法测试了三种 xff0c 建议大家三种都试一下 题外话 xff1a 其中有一台虚拟机蓝屏 xff0c 我把下面三种方法都用了才解决 xff1b 而另一台虚拟机我三种方法都用却解决
  • 3. 51——LCD1602显示 字符、字符串、数字

    51 LCD1602显示 字符 字符串 数字 LCD1602简介LCD1602相关引脚LCD1602写命令 写数据相关操作图 写指令 代码写数据 代码LCD1602显示程序步骤及如何初始化显示开关控制指令进入模式设置指令功能设定指令清屏指令
  • 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32 硬件IIC驱动OLED屏幕显示 OLED屏幕OLED屏幕特点OLED屏幕接线说明OLED屏幕显存OLED屏幕原理OLED屏幕常用指令OLED屏幕字模软件的使用 写命令写数据OLED 初始化 xff08 厂家提供的代码 xff09
  • 15. STM32——软件IIC驱动OLED屏幕显示字符、字符串、数字、汉字

    STM32 软件IIC驱动OLED屏幕显示 OLED屏幕写命令写内容对OLED写入一个字节设置光标启动OLED关闭OLED全屏填充 xff08 清屏 xff09 显示字符显示字符串获取次方显示数字显示中文OLED驱动代码整合代码oled h
  • 16. STM32——测量空气的温度和湿度(STM32 + DHT11温湿度 + OLED显示)

    STM32 测量空气的温度和湿度 xff08 STM32 43 DHT11温湿度 43 OLED显示 xff09 DHT11温湿度相关介绍初始化GPIOB11启动DHT11获取一个字节获取数据代码整合DHT11 hDHT11 coled h
  • 17. STM32——SPI硬件

    STM32 SPI SPI协议SPI接口SPI接口框图SPI工作原理时钟信号的相位和极性CPHA 61 0CPHA 61 1 SPI中断状态标志发送缓存器空闲标志 xff08 TXE xff09 接收缓冲器非空 RXNE 忙BUSY标志 S
  • 关于anaconda下载之后在开始菜单找不到快捷方式的问题

    这是我在安装anaconda时犯的错误 xff0c 安装之后在开始菜单没有找到关于anaconda的文件夹 jupyter notebook spyder anaconda prompt 安装了好多遍 xff0c 最后才知道方法如此简单 第
  • 对帧率、I/P率、I帧间隔的理解2021-11-16

    对帧率 I P率 I帧间隔的理解 码率就是数据传输时单位时间传送的数据位数 一般我们用的单位是kbps即千位每秒 通俗一点的理解就是取样率 xff0c 单位时间内取样率越大 xff0c 精度就越高 xff0c 处理出来的文 件就越接近原始文

随机推荐