Python制作自己的软件安装包程序
我看现在网上给自己的Python程序制作安装包一般都是使用inno setup,于是我突然想到能不能自己编写安装包程序(想快速了解制作方法的直接跳到最后)
首先肯定是要把安装包程序和安装的内容放进同一个exe中,而要安装的内容毫无疑问,肯定要放到压缩包里,那把安装程序和压缩包捆绑到一起用copy /b 安装程序.exe+file.zip output.exe
这个命令就好了,运行起来也是会直接运行exe的(顺序不能反)
那问题就是如何从exe里提取出zip了,现在就出现了两种方法:
- 通过读取exe头信息来确定exe文件大小,从而切割文件
- 通过读取压缩包头信息来确定压缩包位置,从而切割文件(zip格式头信息为PK,7z为7z)
第一种方法我进行了尝试
那思路清晰了,只需要读取偏移量为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":breakf.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 executablewith open(executable,"rb") as f:#f.seek(5000000,0)while True:if f.read(1) == b"P" and f.read(1) == b"K":breakf.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操作注册表即可,详情自己百度