👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
开场 20 秒
“程序在我电脑跑得欢,用户一双击就闪退/报错/被杀毒拦截。”
本讲 15 分钟,给你一套“远程问诊”三板斧:日志、调试模式、符号表;再附送 10 个高频错误速查表,做到用户截图即可秒回解决方案。
9.1 三板斧:让用户帮你抓日志(3 min)
日志开关
.spec 里打开 debug 与控制台,方便复现:1
2
3
4
5exe = EXE(
...
debug=True, # 输出详细回溯
console=True, # 保留黑框
)发“诊断版”给用户,复现后立刻关闭。
运行时钩子输出
_MEIPASS
路径1
2
3
4
5# runtime_hook_log.py
import sys, os, pathlib, datetime
log = pathlib.Path.home() / 'myapp_debug.log'
with log.open('a', encoding='utf-8') as f:
f.write(f"{datetime.datetime.now()} _MEIPASS={getattr(sys, '_MEIPASS', 'None')}\n").spec 加入
1
a = Analysis(..., runtime_hooks=['runtime_hook_log.py'])
一键收集脚本(Windows 示例)
1
2
3
4
5@echo off
echo 正在收集信息...
myapp.exe > log.txt 2>&1
echo log.txt 已生成,请把文件发给我们
pause
9.2 本地复现:用 --onedir
调试(2 min)
把生产包 --onefile
改 --onedir
,直接运行 dist/myapp/myapp.exe
:
- 报错信息完整
- 缺 DLL/资源立即可见
修复后再--onefile
出正式包。
9.3 10 个高频错误速查表(8 min)
错误文本 | 场景 | 根因 | 一键修复 |
---|---|---|---|
Error loading Python DLL | Win 7 | 缺 VC++ 运行库 | 附带 vc_redist.x64.exe 或静态编译 |
Failed to execute script main | 任何平台 | 资源路径错误 | _MEIPASS 定位 + 检查 --add-data |
ImportError: libtorch.so | Linux | 系统缺 .so | --add-binary "/usr/lib/libtorch.so:." |
Could not find Qt platform plugin | PyQt/PySide | 插件未打包 | hiddenimports=['PyQt5.QtCore'] + datas=[(qt_plugins, 'plugins')] |
Illegal instruction (core dumped) | Linux | CPU 指令集过高 | 用 torch-cpu 或在 CI 加 -march=x86-64 |
Windows Defender 报毒 | 所有 | UPX/签名/启发式 | 关闭 UPX、代码签名、提交误报 |
*No module named ‘sklearn.‘** | 动态 import | 隐藏导入 | --hidden-import sklearn.utils._cython_blas |
_tkinter.TclError: no display name | Linux 无桌面 | 无 $DISPLAY | 判断 os.environ.get('DISPLAY') 给出 CLI fallback |
macOS “damaged” | Gatekeeper | 未签名 | codesign --force --deep --sign - 自签名 |
闪退无窗口 | GUI 程序 | 加了 --noconsole 但 print 报错 |
发调试版 --console 先看回溯 |
9.4 远程调试黑科技(2 min)
faulthandler 在崩溃时自动写栈
1
2import faulthandler, tempfile, os
faulthandler.enable(open(os.path.join(tempfile.gettempdir(), 'crash.log'), 'w'))崩溃自动上传
1
2
3
4
5
6
7import requests, traceback, platform
try:
main()
except Exception:
with open('crash.log', 'w') as f:
traceback.print_exc(file=f)
requests.post("https://your-api.com/upload", files={'file': open('crash.log','rb')})
9.5 用户沟通模板(可复制)
1 | 【诊断版下载】 |
小结 & 作业(30 秒)
• 三板斧:诊断版 + 日志 + --onedir
本地复现
• 10 个错误速查表贴在 README,减少 80 % 重复提问
• 作业:给自己项目加崩溃日志上传,并验证能否收到 traceback
下节课《第十讲:进阶主题——自解压安装包、插件化、商业保护》教你把 exe 做成安装器、加授权、再加壳。
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利