手机投屏到电脑(adb加python)

注:这是本人用adb连接手机用python写的图像界面,使用前请先用adb连接好要控制的手机如果不知道怎么连接的可以看我这篇文章电脑adb连接模拟器,本项目以上传到本人Github仓库,但因为是python的原因可能会有一点延迟。

Github仓库地址:suyihang15/ADB-link-tool: 用于有电脑上用ADB连接手机的需求的人,做了简单的图形化界面

1、环境准备

python

2、源码介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import subprocess
import cv2
import numpy as np
import tkinter as tk
from PIL import Image, ImageTk
import threading
import time

# 改成你自己的 adb 路径
ADB_PATH = r"\adb.exe" #填你下载的adb.exe文件的地址,不然后面的都不行的,记住
WIN_W = 480
WIN_H = 950

class PhoneControl:
def __init__(self, root):
self.root = root
self.root.title("手机联机软件(作者Mr.苏)")
self.root.geometry(f"{WIN_W}x{WIN_H}")

# 1. 投屏显示区域:用于显示手机画面
self.screen = tk.Label(root)
self.screen.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
self.screen.bind("<Button-1>", self.click) # 绑定鼠标点击事件

# 2. 功能按键区:返回、主页、唤醒等
btn_frame = tk.Frame(root)
btn_frame.pack(pady=5)
tk.Button(btn_frame, text="返回", command=self.back).grid(row=0, column=0, padx=3)
tk.Button(btn_frame, text="主页", command=self.home).grid(row=0, column=1, padx=3)
tk.Button(btn_frame, text="唤醒", command=self.wake).grid(row=0, column=2, padx=3)
tk.Button(btn_frame, text="电源", command=self.power).grid(row=0, column=3, padx=3)
tk.Button(btn_frame, text="截图", command=self.screenshot).grid(row=0, column=4, padx=3)

# 3. ADB 命令终端区:输入自定义命令
term_frame = tk.Frame(root)
term_frame.pack(fill=tk.X, padx=10, pady=5)
tk.Label(term_frame, text="ADB命令:").pack(side=tk.LEFT)
self.cmd_input = tk.Entry(term_frame)
self.cmd_input.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
tk.Button(term_frame, text="执行", command=self.run_cmd).pack(side=tk.LEFT)

# 命令输出框:显示命令执行结果
self.output_box = tk.Text(root, height=6)
self.output_box.pack(fill=tk.BOTH, padx=10, pady=5)

self.running = True
self.current_frame = None

# 启动投屏线程
threading.Thread(target=self.stream, daemon=True).start()
# 启动声音转发线程
threading.Thread(target=self.audio, daemon=True).start()
# 启动界面刷新循环
self.update_ui()

# ---------------------- 核心功能模块 ----------------------
# 投屏流获取:不断从手机抓取屏幕数据(核心循环)
def stream(self):
while self.running:
try:
# 使用 ADB exec-out 命令抓取手机屏幕二进制流
data = subprocess.run([ADB_PATH, "exec-out", "screencap", "-p"], stdout=subprocess.PIPE).stdout
# 数据过短表示抓取失败,跳过
if len(data) < 1000:
continue
# 将二进制流转为 numpy 数组
nparr = np.frombuffer(data, np.uint8)
# 解码为图片
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 转换颜色格式 (BGR -> RGB) 并赋值给当前帧变量
if img is not None:
self.current_frame = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
except:
pass
# 控制抓取频率,0.008秒 = 125帧左右
time.sleep(0.008)

# UI 画面刷新:将 current_frame 显示在 Label 上
def update_ui(self):
if self.current_frame is not None:
try:
h, w = self.current_frame.shape[:2]
# 计算缩放比例,保证画面适应窗口且不变形
scale = min(WIN_W/w, 850/h)
img = cv2.resize(self.current_frame, (int(w*scale), int(h*scale)))
# 转为 Tkinter 可用的图片格式
imgtk = ImageTk.PhotoImage(Image.fromarray(img))
# 更新界面显示
self.screen.config(image=imgtk)
self.screen.imgtk = imgtk # 强制保存引用,防止被垃圾回收
except:
pass
# 递归调用,实现每 8 毫秒刷新一次界面
if self.running:
self.root.after(8, self.update_ui)

# 鼠标点击控制:将电脑鼠标坐标映射为手机坐标并发送点击指令
def click(self, e):
if self.current_frame is None:
return
h, w = self.current_frame.shape[:2]
# 计算真实的手机点击位置
x = int(e.x * w / WIN_W)
y = int(e.y * h / 850)
# 执行 ADB 点击命令
subprocess.Popen([ADB_PATH, "shell", "input", "tap", str(x), str(y)])

# 音频转发:通过 screenrecord 转发手机声音流
def audio(self):
while self.running:
try:
# 启动手机录屏并输出到标准输出(用于转发声音)
subprocess.Popen([ADB_PATH, "shell", "screenrecord", "--output-format", "h264", "-"],
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
except:
pass
time.sleep(1)

# ---------------------- 基础按键功能模块 ----------------------
# 模拟手机返回键
def back(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "4"])
# 模拟手机主页键
def home(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "3"])
# 模拟多任务键
def recent(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "187"])
# 模拟唤醒屏幕/点亮屏幕
def wake(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "224"])
# 模拟电源键(锁屏/点亮)
def power(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "26"])

# 截图功能:截取手机屏幕并保存到电脑
def screenshot(self):
try:
# 先在手机内存截图
subprocess.run([ADB_PATH, "shell", "screencap", "/sdcard/screenshot.png"])
# 拉取到电脑当前目录
subprocess.run([ADB_PATH, "pull", "/sdcard/screenshot.png", "screenshot.png"])
self.output_box.insert(tk.END, "\n截图已保存到当前目录:screenshot.png")
except:
self.output_box.insert(tk.END, "\n截图失败")

# ADB 命令执行:读取输入框的命令并执行
def run_cmd(self):
cmd = self.cmd_input.get().strip()
if not cmd:
return
try:
# 拆分命令并执行
res = subprocess.run([ADB_PATH] + cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 输出结果
self.output_box.insert(tk.END, f"\n> {cmd}\n{res.stdout}{res.stderr}")
self.output_box.see(tk.END) # 滚动到最底部
except Exception as e:
self.output_box.insert(tk.END, f"\n错误:{str(e)}")

if __name__ == "__main__":
root = tk.Tk()
app = PhoneControl(root)
root.mainloop()

3、运行

(1)安装所需第三方库 pip install opencv-python numpy pillow

(2)运行python文件

4、效果展示

这些就是全部功能,如果想直接使用就直接用我打包好的exe文件就行。

5、打包

因为本身功能不算多,打包用pyinstaller这个,后面会再优化以下,可以自行打包试试记得要用到adb.exe哦,要把他一起打包才有用哦,因为本身是基于它的。

wordpress文章转markdown

1、环境准备

下载node.js

2、这里提取出.xml文章文件

1
2
3
4
重命名为export.xml(很重要)
在存在export.xml的文件夹里打开cmd输入
npx wordpress-export-to-markdown
根据提示下一步就行。

如何定制一个自己的Windows镜像

注意:如果你已经厌倦了Windows自带的一些你可能这一辈子都不会用的内置软件或一些功能,可以试试自己定制一款自己的Windows镜像,在原版的基础上进行魔改,这是本人根据前面自己操作和别人分享的资料以后写下了这些流程,那么你可以看看

1、前期准备工具与文件

(1)windows镜像(主要是提取出install.win文件与后面放入)

(2)NTLite(用于更改install.win文件的内容,就系统层面的,打补丁什么的都可以)这个他一些功能是要收费的,但是我们用免费版的足够了。

(3)vmware(用于一些基本的设置和内置捆绑的软件,就内置软件和设置什么的)

(4)PE.iso(用于在虚拟机上安装系统因为这是的文件是install.win不是我们知道的iso文件了,是要更改这里的内容)

(5)Easy sysprep(用于更改后的install.win文件封装)

(6)AnyBurn(用于把文件最后封装为iso文件)

2、更改install.win

在电脑上挂载windows11光盘

在光盘的驱动盘:\sources有install.win文件

复制粘贴出来,这就是我们要更改的文件

用NTLite这一个软件打开install.win文件

这里你可以根据自己的需要来删除你需要的windows版本,只保留你需要的

前面挂载完成后就可以对一些不要的组件和功能进行改动了,但是如果不清楚是干什么的就不要乱改,不然在这个层面修改可能会导致改出来的系统连不上网容易崩溃等一系列问题,如果要打补丁也可以在这里修改,但是你自己要确定你的补丁没有问题,这里你就要自己发挥了

以下是其作用和介绍

1、映像

  • 功能:加载、选择、保存系统镜像,选择系统版本。

  • 注意:用原版镜像,操作前备份,建议在虚拟机操作。

2、整合

更新整合

  • 功能:把系统补丁注入镜像,装完自带更新。

  • 注意:只加正式补丁,分批添加,版本匹配系统。

驱动程序

  • 功能:注入硬件驱动,装机自动识别设备。

  • 注意:用通用驱动,必加USB、网卡、硬盘驱动,不重复添加。

注册表

  • 功能:预设系统优化,装完自动生效。

  • 注意:不用不明注册表文件,不乱改核心项。

后期任务

  • 功能:首次进桌面自动装软件、运行脚本。

  • 注意:路径准确,不装大型软件,按驱动→软件→优化顺序执行。

3、移除(如果是第一次的话建议可以先试试改这里的内容)

组件移除

  • 功能:删除无用组件,精简系统。

  • 注意:不删.NET、驱动框架等核心组件,精简适度。

计划任务

  • 功能:禁用后台自动任务,减少占用。

  • 注意:保留安全相关任务,不全禁用。

4、配置

功能设置

  • 功能:开关系统自带功能(如.NET、虚拟机)。

  • 注意:必开.NET,不用的功能关闭。

设置

  • 功能:优化账户、网络、服务、电源等基础设置。

  • 注意:不关闭关键服务,隐私设置适度调整。

无人值守

  • 功能:自动跳过装机设置,实现全自动安装。

  • 注意:提前测试,信息填写准确。

结束→应用

  • 功能:保存所有修改,生成新镜像。

  • 注意:先清理垃圾,优先保存为WIM格式,生成后测试安装。

搞好以后点击应用,左边这么选择,右边是你更改的东西

之后点击开始就行。

3、创建一个虚拟磁盘(用于存放windows镜像)

注:有的人可能觉得为什么还要创建一个虚拟磁盘这不是浪费时间吗,但是这一部是很重要的,我们电脑本身是在Windows系统下运行,其可能会受到其本身系统的影响,创建一个虚拟磁盘可以很好的避免这些问题。

打开创建磁盘并格式化分区选择一个盘然后右键进行如下操作

选择好要放到文件夹,然后初始化并创建分区,就选择默认的就行

创建分区以后电脑上就会多出来一个盘了,后面要用到

把EasySysprep和制作好了的install.win放入这个虚拟磁盘里面

还有你要安装的软件的安装包放在里面如果你要安装软件的话,因为我们在后需虚拟机上的操作是没有网络的,各家网卡各不相同,所以我们要经量使自己做的镜像通用。而且方便后面挂载到虚拟机上面。

放入以后,还要分离VHD,不然虚拟机不能挂载的

4、PE生成镜像文件

这里我们要用微PE生成一个pe.iso文件,用于虚拟机对于镜像的操作

5、创建虚拟机

创建好虚拟机,选择wepe.iso只保留如下东西

不然可能会有问题,然后安装时选择他认的操作系统是windows10不要11不要硬盘要加密,不然添加不了硬盘,之前我在这里卡了很久,就这里

然后添加磁盘,把之前创建的虚拟磁盘添加好

启动虚拟机

先分区,如下操作就行

再安装系统,注意这里选镜像时是选择之前放入虚拟磁盘的install.win了

之后就会静入Windows界面,按住ctrl shift F3会自动重启进入审核桌面,这里可以直接进入windos界面,方便然后你就可以进行设置了,你在里面做的所有设置都会被封装下来的。

进入审核桌面改好操作好

就打开另外一个磁盘里的EasySysprep,全部默认,只改图片上的就行

重启以后要一定进入PE界面,虚拟机是按一下esc就行,然后进入,不然会封装失败

后面根据自己的需求继续设置就行,最后会有install.win文件

根据自己的需要改好就行,然后把install.win文件粘贴到Windows的iso里面替换到原位置就行了。

再用anyburn封装,点击编辑镜像文件把那个install.win替换就行了

总结:系统封装是根据自己的需求来进行调整,方便自己使用,而且可玩性很高,以上便是我自己总结的,如果有问题或者不会的地方可以留言,我会回复的。

希望对你有帮助。

虚拟机创建(windows沙盒与vmware)

注:当我们需要测试一些不太好在主机上跑的软件时,就可以利用虚拟机,这是一个单独隔离的环境可以方便我们玩,而且算是一个真实的环境做测试。

以下的实现基于你已经在Blos已经开启了虚拟化设置(各家主板的操作各不相同这里就不作介绍)

1、windows沙盒(个人觉得操作简单,但是只能模拟你自己的系统,如果有病毒这些可能有感染主机的风险)

(1)前提条件是你的电脑必须是Windows专业版,不然根本玩不了,可以手动升级一下

(2)打开控制面板,卸载软件,然后会有启用或关闭Windows功能点击,就会如下

找到Hyper-V和windows沙盒确定后重启就会有windows沙盒这个东西了,点开就行了,整体是很简单的

就是这个样子的

2、Vmware(一般来说是比较常用且通用的)

(1)你要先准备好所需要的对应系统的windows镜像文件

windows11的镜像下载,这里要选择一下下载的windows镜像文件

创建一个密码启动就行了

跟着引导走就行了,后面就可以得到这个了

wordpress文章转markdown

1、环境准备

下载node.js

2、这里提取出.xml文章文件

1
2
3
4
重命名为export.xml(很重要)
在存在export.xml的文件夹里打开cmd输入
npx wordpress-export-to-markdown
根据提示下一步就行。

如何定制一个自己的Windows镜像

注意:如果你已经厌倦了Windows自带的一些你可能这一辈子都不会用的内置软件或一些功能,可以试试自己定制一款自己的Windows镜像,在原版的基础上进行魔改,这是本人根据前面自己操作和别人分享的资料以后写下了这些流程,那么你可以看看

1、前期准备工具与文件

(1)windows镜像(主要是提取出install.win文件与后面放入)

(2)NTLite(用于更改install.win文件的内容,就系统层面的,打补丁什么的都可以)这个他一些功能是要收费的,但是我们用免费版的足够了。

(3)vmware(用于一些基本的设置和内置捆绑的软件,就内置软件和设置什么的)

(4)PE.iso(用于在虚拟机上安装系统因为这是的文件是install.win不是我们知道的iso文件了,是要更改这里的内容)

(5)Easy sysprep(用于更改后的install.win文件封装)

(6)AnyBurn(用于把文件最后封装为iso文件)

2、更改install.win

在电脑上挂载windows11光盘

在光盘的驱动盘:\sources有install.win文件

复制粘贴出来,这就是我们要更改的文件

用NTLite这一个软件打开install.win文件

这里你可以根据自己的需要来删除你需要的windows版本,只保留你需要的

前面挂载完成后就可以对一些不要的组件和功能进行改动了,但是如果不清楚是干什么的就不要乱改,不然在这个层面修改可能会导致改出来的系统连不上网容易崩溃等一系列问题,如果要打补丁也可以在这里修改,但是你自己要确定你的补丁没有问题,这里你就要自己发挥了

以下是其作用和介绍

1、映像

  • 功能:加载、选择、保存系统镜像,选择系统版本。

  • 注意:用原版镜像,操作前备份,建议在虚拟机操作。

2、整合

更新整合

  • 功能:把系统补丁注入镜像,装完自带更新。

  • 注意:只加正式补丁,分批添加,版本匹配系统。

驱动程序

  • 功能:注入硬件驱动,装机自动识别设备。

  • 注意:用通用驱动,必加USB、网卡、硬盘驱动,不重复添加。

注册表

  • 功能:预设系统优化,装完自动生效。

  • 注意:不用不明注册表文件,不乱改核心项。

后期任务

  • 功能:首次进桌面自动装软件、运行脚本。

  • 注意:路径准确,不装大型软件,按驱动→软件→优化顺序执行。

3、移除(如果是第一次的话建议可以先试试改这里的内容)

组件移除

  • 功能:删除无用组件,精简系统。

  • 注意:不删.NET、驱动框架等核心组件,精简适度。

计划任务

  • 功能:禁用后台自动任务,减少占用。

  • 注意:保留安全相关任务,不全禁用。

4、配置

功能设置

  • 功能:开关系统自带功能(如.NET、虚拟机)。

  • 注意:必开.NET,不用的功能关闭。

设置

  • 功能:优化账户、网络、服务、电源等基础设置。

  • 注意:不关闭关键服务,隐私设置适度调整。

无人值守

  • 功能:自动跳过装机设置,实现全自动安装。

  • 注意:提前测试,信息填写准确。

结束→应用

  • 功能:保存所有修改,生成新镜像。

  • 注意:先清理垃圾,优先保存为WIM格式,生成后测试安装。

搞好以后点击应用,左边这么选择,右边是你更改的东西

之后点击开始就行。

3、创建一个虚拟磁盘(用于存放windows镜像)

注:有的人可能觉得为什么还要创建一个虚拟磁盘这不是浪费时间吗,但是这一部是很重要的,我们电脑本身是在Windows系统下运行,其可能会受到其本身系统的影响,创建一个虚拟磁盘可以很好的避免这些问题。

打开创建磁盘并格式化分区选择一个盘然后右键进行如下操作

选择好要放到文件夹,然后初始化并创建分区,就选择默认的就行

创建分区以后电脑上就会多出来一个盘了,后面要用到

把EasySysprep和制作好了的install.win放入这个虚拟磁盘里面

还有你要安装的软件的安装包放在里面如果你要安装软件的话,因为我们在后需虚拟机上的操作是没有网络的,各家网卡各不相同,所以我们要经量使自己做的镜像通用。而且方便后面挂载到虚拟机上面。

放入以后,还要分离VHD,不然虚拟机不能挂载的

4、PE生成镜像文件

这里我们要用微PE生成一个pe.iso文件,用于虚拟机对于镜像的操作

5、创建虚拟机

创建好虚拟机,选择wepe.iso只保留如下东西

不然可能会有问题,然后安装时选择他认的操作系统是windows10不要11不要硬盘要加密,不然添加不了硬盘,之前我在这里卡了很久,就这里

然后添加磁盘,把之前创建的虚拟磁盘添加好

启动虚拟机

先分区,如下操作就行

再安装系统,注意这里选镜像时是选择之前放入虚拟磁盘的install.win了

之后就会静入Windows界面,按住ctrl shift F3会自动重启进入审核桌面,这里可以直接进入windos界面,方便然后你就可以进行设置了,你在里面做的所有设置都会被封装下来的。

进入审核桌面改好操作好

就打开另外一个磁盘里的EasySysprep,全部默认,只改图片上的就行

重启以后要一定进入PE界面,虚拟机是按一下esc就行,然后进入,不然会封装失败

后面根据自己的需求继续设置就行,最后会有install.win文件

根据自己的需要改好就行,然后把install.win文件粘贴到Windows的iso里面替换到原位置就行了。

再用anyburn封装,点击编辑镜像文件把那个install.win替换就行了

总结:系统封装是根据自己的需求来进行调整,方便自己使用,而且可玩性很高,以上便是我自己总结的,如果有问题或者不会的地方可以留言,我会回复的。

希望对你有帮助。

虚拟机创建(windows沙盒与vmware)

注:当我们需要测试一些不太好在主机上跑的软件时,就可以利用虚拟机,这是一个单独隔离的环境可以方便我们玩,而且算是一个真实的环境做测试。

以下的实现基于你已经在Blos已经开启了虚拟化设置(各家主板的操作各不相同这里就不作介绍)

1、windows沙盒(个人觉得操作简单,但是只能模拟你自己的系统,如果有病毒这些可能有感染主机的风险)

(1)前提条件是你的电脑必须是Windows专业版,不然根本玩不了,可以手动升级一下

(2)打开控制面板,卸载软件,然后会有启用或关闭Windows功能点击,就会如下

找到Hyper-V和windows沙盒确定后重启就会有windows沙盒这个东西了,点开就行了,整体是很简单的

就是这个样子的

2、Vmware(一般来说是比较常用且通用的)

(1)你要先准备好所需要的对应系统的windows镜像文件

windows11的镜像下载,这里要选择一下下载的windows镜像文件

创建一个密码启动就行了

跟着引导走就行了,后面就可以得到这个了

python打包成exe(pyinstaller的使用)

注:当我们用python写好一个完整的程序以后想要把这个py主程序运行到没有安装python的windows时,我们就要用到pyinstaller这个第三方库用来把这些程序打包成exe的可执行文件方便其他人使用你的程序,以下是一个完整的流程

一、项目结构(必须这样放,否则打包必错)

你先建一个文件夹,比如叫  MyApp ,所有东西都放这里。

plaintext

MyApp/
├── main.py # 主程序入口
├── icon.ico # 程序图标(Windows)
├── config.json # 配置文件用于嵌套什么的
├── settings.ini # 配置文件一般是很简单的配置有时我们一般人都可以直接改这两是不同的东西
├── assets/ # 资源文件夹(图片、音频、数据、字体)
│ ├── images/ # 图片
│ ├── sounds/ # 音频
│ ├── data/ # 数据文件(csv、txt、xlsx)
│ └── fonts/ # 字体
├── src/ # 你自己写的模块
│ ├── utils.py #(用于处理时间加密的)
│ ├── api.py #(接口文件)
│ └── ui.py #(用户界面的布局)
└── libs/ # 第三方库/自己封装的库  

二、代码里必须写的路径函数(打包后不丢资源)

把这段代码放到  main.py  最前面,所有资源都用这个函数读取:

python

import sys
import os

def resource_path(relative_path):
if hasattr(sys, ‘_MEIPASS’):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath(‘.’), relative_path)  

例子:

img = resource_path(“assets/images/logo.png”)
config = resource_path(“config.json”)
data = resource_path(“assets/data/data.csv”)  

三、打包前必须做的环境准备(必做)

  1. 打开命令行,进入项目文件夹

cd D:\MyApp #(切换到对应目录)  

  1. 创建虚拟环境(避免打包体积大、报错)

python -m venv venv
 其实不创建也可以,就是感觉容易冲突出问题。

  1. 激活虚拟环境

venv\Scripts\activate  

  1. 安装项目需要的库(只装你用到的)

pip install 你需要的库 #(这个能懂吧)  

  1. 安装 PyInstaller(这就是打包的第三方库)

pip install pyinstaller  

四、最完整打包命令(包含所有文件、资源、模块、图标)

下面这条命令是万能终极版,包含所有你需要的功能,直接复制运行:

pyinstaller -F -w –clean –noconfirm -i icon.ico –add-data “assets;assets” –add-data “config.json;.” –add-data “settings.ini;.” –add-data “src;src” –add-data “libs;libs” main.py

这个前提是每个文件都放在其对应的位置,必须严格放置。  

五、命令每一部分详细解释(你必须懂)

我把上面的命令拆解开,每一段都告诉你是什么、干什么、为什么要加:

  1.  pyinstaller

 

  • 作用:启动打包工具

  • 必须写在最前面

 -F 

  • 全称: –onefile 

  • 作用:打包成单个 exe 文件

  • 不加的话会生成一个文件夹,里面一堆文件

  • 必须加,最常用

-w 

  • 全称: –windowed  /  –noconsole 

  • 作用:不显示黑色控制台窗口

  • 适合 GUI 程序、桌面软件

  • 如果你是命令行程序,就不要加  -w ,用  -c

 

--clean 

  • 作用:打包前自动清理旧缓存、旧文件

  • 避免旧文件干扰导致打包失败

  • 每次打包都建议加

--noconfirm 

  • 作用:打包时不询问是否覆盖,直接覆盖

  • 避免重复打包时弹确认框

-i icon.ico 

  • 作用:设置程序图标

  • 必须是  .ico  格式

  • 放在项目根目录

  1.  –add-data “assets;assets”

 

  • 作用:把  assets  文件夹打包进 exe

  • 格式: 源路径;目标路径 

  • Windows 用分号  ; ,Mac/Linux 用冒号  : 

  • 不加这个,打包后图片、音频、数据都会丢失

--add-data “config.json;.” 

  • 作用:把  config.json  打包到 exe 同目录

  •  .  表示 exe 所在目录

--add-data “settings.ini;.” 

  • 作用:把  settings.ini  打包到 exe 同目录

--add-data “src;src” 

  • 作用:把你自己写的  src  模块文件夹打包进去

  • 不加会导致  import src.utils  报错

--add-data “libs;libs” 

  • 作用:把  libs  文件夹打包进去

  • 如果你有自己的库文件,必须加

main.py 

  • 作用:指定主程序入口文件

  • 必须是你项目的启动文件

六、如果打包后提示“找不到模块”,加这个参数

--hidden-import=模块名  

实例

pyinstaller -F –hidden-import=requests –hidden-import=urllib3 –hidden-import=pandas._libs.tslibs.base main.py  

七、打包后文件在哪里?

打包完成后,在  MyApp  文件夹里:

  •  dist/main.exe  → 最终可执行文件

  •  build/  → 临时文件,可删除

  •  main.spec  → 配置文件,不用管

  • 反正找exe文件就对了

八、最常见问题怎么解决

  1. 打包后闪退

把  -w  换成  -c ,看报错:

pyinstaller -F -c main.py  

  1. 打包后找不到资源

必须加  –add-data ,并且代码用  resource_path 

  1. 打包后 exe 很大(我自己一般不管,因为自己用懒得配虚拟环境了,个人感觉问题也不大)

用虚拟环境,只装必要库

  1. 打包后报毒

这个是正常的,因为是自己写的软件,现在软件基本上要搞数字签名才不会包病毒,如果觉得烦可以去研究一下

  1. 打包后功能不全

检查是否漏了  –add-data  或  –hidden-import 

九、以下是一些常用的模板吧,对应打命令就行

  1. 最常用(单文件 + 无黑窗 + 图标 + 资源)

pyinstaller -F -w –clean -i icon.ico –add-data “assets;assets” main.py  

  1. 调试用(单文件 + 显示黑窗 + 看报错)

pyinstaller -F -c –clean main.py  

  1. 完整项目(包含所有文件、模块、配置)

pyinstaller -F -w –clean –noconfirm -i icon.ico –add-data “assets;assets” –add-data “config.json;.” –add-data “src;src” main.py

总结:大致的方法就是这样,因为打包还是要根据你自己写的具体情况来分析,如果你是严格按照规定来的大概率没有问题,但是,你如果写的是屎山,那你就得自己研究了,反正方法大差不差,我就只能提供个思路。代码是死的,人是活的嘛,只要能达到目的一切都好,哪怕写的是屎山。

用python做一个密码箱小工具(已在本人github仓库可以看看)

注:因为本人经常记不住密码所以用python写了这个工具箱,并用pyinstaller这个第三方库打包成了exe文件。并附上exe下载地址和代码介绍与样式,本人能力有限希望勿喷。

下载地址:

https://github.com/suyihang15/password-manager/releases/download/v1.0.0/default.exe

项目地址

suyihang15/password-manager: python写的本地密码记录本

项目界面

启动后就是上面那个样子

添加保存以后就会在改文件夹里生成

passwords.json(作用:密码箱)

secret.key(作用:钥匙)

不能随便删除,删了数据就没了

成功以后打开软件就会以这样的方式呈现。

我个人觉得是很直观的,当然你也可以拿着这些代码随便改,反正都有注释的

要直接用源码的话,需要你自己配置环境

1、python 3.11

2、安装第三方库pip install cryptography(我个人是喜欢pycharm或者vs code的这两个IDE的,当然你要用文本文档也行,反正代码也不多,就是格式容易错)安装第三方库时有可能网络超时,就自己配镜像源吧

3、如果改好了可以打包了,个人推荐pyinstaller

(1)安装库pip install pyinstaller和pip install cryptography记得要把这个环境一起打包进去,不然运行不了

(2)打包pyinstaller -F -w –hidden-import=cryptography 文件名字.py

之后就生成一些文件里面就有exe文件,就可以直接拿来用了

希望对你有帮助,如果可以希望点一个star。

python打包成exe(pyinstaller的使用)

注:当我们用python写好一个完整的程序以后想要把这个py主程序运行到没有安装python的windows时,我们就要用到pyinstaller这个第三方库用来把这些程序打包成exe的可执行文件方便其他人使用你的程序,以下是一个完整的流程

一、项目结构(必须这样放,否则打包必错)

你先建一个文件夹,比如叫  MyApp ,所有东西都放这里。

plaintext

MyApp/
├── main.py # 主程序入口
├── icon.ico # 程序图标(Windows)
├── config.json # 配置文件用于嵌套什么的
├── settings.ini # 配置文件一般是很简单的配置有时我们一般人都可以直接改这两是不同的东西
├── assets/ # 资源文件夹(图片、音频、数据、字体)
│ ├── images/ # 图片
│ ├── sounds/ # 音频
│ ├── data/ # 数据文件(csv、txt、xlsx)
│ └── fonts/ # 字体
├── src/ # 你自己写的模块
│ ├── utils.py #(用于处理时间加密的)
│ ├── api.py #(接口文件)
│ └── ui.py #(用户界面的布局)
└── libs/ # 第三方库/自己封装的库  

二、代码里必须写的路径函数(打包后不丢资源)

把这段代码放到  main.py  最前面,所有资源都用这个函数读取:

python

import sys
import os

def resource_path(relative_path):
if hasattr(sys, ‘_MEIPASS’):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath(‘.’), relative_path)  

例子:

img = resource_path(“assets/images/logo.png”)
config = resource_path(“config.json”)
data = resource_path(“assets/data/data.csv”)  

三、打包前必须做的环境准备(必做)

  1. 打开命令行,进入项目文件夹

cd D:\MyApp #(切换到对应目录)  

  1. 创建虚拟环境(避免打包体积大、报错)

python -m venv venv
 其实不创建也可以,就是感觉容易冲突出问题。

  1. 激活虚拟环境

venv\Scripts\activate  

  1. 安装项目需要的库(只装你用到的)

pip install 你需要的库 #(这个能懂吧)  

  1. 安装 PyInstaller(这就是打包的第三方库)

pip install pyinstaller  

四、最完整打包命令(包含所有文件、资源、模块、图标)

下面这条命令是万能终极版,包含所有你需要的功能,直接复制运行:

pyinstaller -F -w –clean –noconfirm -i icon.ico –add-data “assets;assets” –add-data “config.json;.” –add-data “settings.ini;.” –add-data “src;src” –add-data “libs;libs” main.py

这个前提是每个文件都放在其对应的位置,必须严格放置。  

五、命令每一部分详细解释(你必须懂)

我把上面的命令拆解开,每一段都告诉你是什么、干什么、为什么要加:

  1.  pyinstaller

 

  • 作用:启动打包工具

  • 必须写在最前面

 -F 

  • 全称: –onefile 

  • 作用:打包成单个 exe 文件

  • 不加的话会生成一个文件夹,里面一堆文件

  • 必须加,最常用

-w 

  • 全称: –windowed  /  –noconsole 

  • 作用:不显示黑色控制台窗口

  • 适合 GUI 程序、桌面软件

  • 如果你是命令行程序,就不要加  -w ,用  -c

 

--clean 

  • 作用:打包前自动清理旧缓存、旧文件

  • 避免旧文件干扰导致打包失败

  • 每次打包都建议加

--noconfirm 

  • 作用:打包时不询问是否覆盖,直接覆盖

  • 避免重复打包时弹确认框

-i icon.ico 

  • 作用:设置程序图标

  • 必须是  .ico  格式

  • 放在项目根目录

  1.  –add-data “assets;assets”

 

  • 作用:把  assets  文件夹打包进 exe

  • 格式: 源路径;目标路径 

  • Windows 用分号  ; ,Mac/Linux 用冒号  : 

  • 不加这个,打包后图片、音频、数据都会丢失

--add-data “config.json;.” 

  • 作用:把  config.json  打包到 exe 同目录

  •  .  表示 exe 所在目录

--add-data “settings.ini;.” 

  • 作用:把  settings.ini  打包到 exe 同目录

--add-data “src;src” 

  • 作用:把你自己写的  src  模块文件夹打包进去

  • 不加会导致  import src.utils  报错

--add-data “libs;libs” 

  • 作用:把  libs  文件夹打包进去

  • 如果你有自己的库文件,必须加

main.py 

  • 作用:指定主程序入口文件

  • 必须是你项目的启动文件

六、如果打包后提示“找不到模块”,加这个参数

--hidden-import=模块名  

实例

pyinstaller -F –hidden-import=requests –hidden-import=urllib3 –hidden-import=pandas._libs.tslibs.base main.py  

七、打包后文件在哪里?

打包完成后,在  MyApp  文件夹里:

  •  dist/main.exe  → 最终可执行文件

  •  build/  → 临时文件,可删除

  •  main.spec  → 配置文件,不用管

  • 反正找exe文件就对了

八、最常见问题怎么解决

  1. 打包后闪退

把  -w  换成  -c ,看报错:

pyinstaller -F -c main.py  

  1. 打包后找不到资源

必须加  –add-data ,并且代码用  resource_path 

  1. 打包后 exe 很大(我自己一般不管,因为自己用懒得配虚拟环境了,个人感觉问题也不大)

用虚拟环境,只装必要库

  1. 打包后报毒

这个是正常的,因为是自己写的软件,现在软件基本上要搞数字签名才不会包病毒,如果觉得烦可以去研究一下

  1. 打包后功能不全

检查是否漏了  –add-data  或  –hidden-import 

九、以下是一些常用的模板吧,对应打命令就行

  1. 最常用(单文件 + 无黑窗 + 图标 + 资源)

pyinstaller -F -w –clean -i icon.ico –add-data “assets;assets” main.py  

  1. 调试用(单文件 + 显示黑窗 + 看报错)

pyinstaller -F -c –clean main.py  

  1. 完整项目(包含所有文件、模块、配置)

pyinstaller -F -w –clean –noconfirm -i icon.ico –add-data “assets;assets” –add-data “config.json;.” –add-data “src;src” main.py

总结:大致的方法就是这样,因为打包还是要根据你自己写的具体情况来分析,如果你是严格按照规定来的大概率没有问题,但是,你如果写的是屎山,那你就得自己研究了,反正方法大差不差,我就只能提供个思路。代码是死的,人是活的嘛,只要能达到目的一切都好,哪怕写的是屎山。