正常打包会输出类似日志:
406 INFO: PyInstaller: 6.22.3, contrib hooks: 2026.7
407 INFO: Python: 3.13.15
439 INFO: Platform: Windows-2012ServerR2-6.3.9600-SP0
444 INFO: wrote C:\vmq.spec
...
56367 INFO: Building EXE from EXE-00.toc completed successfully.
56377 INFO: Build complete! The results are available in: C:\dist
看到最后一行 Build complete! The results are available in: C:\dist,就说明成功了。产物在:
C:\dist\vmq.exe
5. 打包过程中容易遇到的报错
5.1 'pyinstaller' 不是内部或外部命令
原因:PyInstaller 没装,或者它的 Scripts 目录不在 PATH。
解决:用 python -m PyInstaller 调用,或者:
python -m pip install pyinstaller
5.2 把 Python 代码当 cmd 命令敲
日志里最后出现了这种报错:
C:\>pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
'pytesseract.pytesseract.tesseract_cmd' 不是内部或外部命令...
这是把 Python 代码当成 cmd 命令敲了。它只能写在 .py 脚本里,不能直接在 cmd 里运行。跟打包没有任何关系,忽略即可。
5.3 打包成功但 exe 运行闪退
先确认你打包时没加 -w。如果加了 -w,闪退时看不到任何信息。
解决办法:去掉 -w 重新打包,用控制台模式运行,看具体报错。
5.4 缺少 win32ui / win32gui 等模块
这就是我们在命令里加 --hidden-import 的原因。如果运行后还报其他 win32* 模块缺失,继续补:
--hidden-import win32api
--hidden-import win32process
5.5 缺 DLL
有些环境打包后运行会报缺某个 DLL。常见处理方式:
- 找到缺失的 DLL(比如
libiomp5md.dll),手动复制到 C:\dist\ 同目录。 - 或者用
--add-binary 显式打包:
--add-binary "path\to\xxx.dll;."
6. 关于 Tesseract 的处理
这是打包这个脚本最容易踩坑的地方。
6.1 最基本的方式:要求目标机器单独安装
你脚本里写死了 Tesseract 路径:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
这意味着:任何运行这个 exe 的电脑,都必须把 Tesseract 装在完全相同的路径下,并且勾选 chi_sim 中文语言包。
这是最省事、最稳定的方式。部署时多一步,但后续不会因为路径问题出幺蛾子。
6.2 更灵活的方式:改成环境变量或自动探测
把脚本里那一行改成:
import os
tess_path = os.environ.get('TESSERACT_CMD', r'C:\Program Files\Tesseract-OCR\tesseract.exe')
pytesseract.pytesseract.tesseract_cmd = tess_path
这样目标机器可以通过环境变量指定 Tesseract 位置,不用非得装在默认路径。
6.3 想把 Tesseract 一起打包进去?
理论上可行,但需要静态编译版 Tesseract + spec 文件配置 binaries。
简单说:
- 找一个静态编译的
tesseract.exe(不依赖外部 DLL)。 - 把
tesseract.exe 和 tessdata/ 一起通过 spec 文件的 binaries 打进 exe。 - 脚本里用
sys._MEIPASS 定位打包后解压出来的临时路径。
但要注意:这解决的是部署问题,不是稳定性问题。 详见下一节。
7. 稳定性说明:打包 ≠ 长期稳定
这一点必须单独讲清楚。
你脚本用的是 pytesseract,它的本质是每次 OCR 都启动一个新的 tesseract.exe 子进程,识别完就销毁。
按 SCAN_INTERVAL = 1.5 算,一天下来是 5.7 万次进程创建和销毁。这带来两个问题:
- Tesseract 本身存在内存泄漏:持续调用时进程物理内存会持续增长。
- 子进程崩溃风险:Windows 上有报告 Tesseract 子进程直接
APPCRASH,错误码 0xc000001d。
所以:
打包成 exe 只是解决了“部署时少装 Python”,并没有解决“长期挂机不掉线”。
如果你只是短期用,没问题。如果要 7×24 挂机,建议:
- 加自动重启兜底:用 Windows 任务计划程序定时杀掉旧进程、启动新进程。
- 换成常驻内存的 Tesseract 引擎:用
tesserocr 直接调用 Tesseract 的 C++ API,模型只加载一次,避免反复起子进程。学术实测延迟降低 77%。
8. 打包成无控制台版本
确认有控制台的版本能正常跑之后,再加 -w:
python -m PyInstaller -F -w ^
--hidden-import win32ui ^
--hidden-import win32gui ^
--hidden-import win32con ^
--hidden-import PIL._tkinter_finder ^
vmq.py
产物依然是 C:\dist\vmq.exe,但运行时不会弹出控制台窗口。
提醒:-w 模式下如果出问题,程序会静默闪退。所以务必先确认无 -w 版本稳定,再切换。
9. 打包后怎么验证
按顺序做这几步:
- 双击运行
C:\dist\vmq.exe(无 -w 版本),看控制台是否打印启动日志。 - 确认窗口标题匹配:确保”微信收款助手”窗口已打开,脚本能找到它。
- 确认 OCR 正常:让脚本跑一轮,看是否能识别到时间和金额。
- 确认推送正常:看 V免签服务端是否收到
/appPush,返回成功。 - 确认心跳正常:看
/appHeart 是否被定时调用。
如果这几步都通了,再打包 -w 版本,部署到目标机器。
10. 部署到目标机器时要注意
| 要求 |
说明 |
| Tesseract-OCR |
目标机器必须安装,路径与脚本一致,或通过环境变量指定 |
| 中文语言包 |
安装 Tesseract 时要勾选 chi_sim |
| 微信收款助手 |
需要运行微信并打开该窗口 |
| 网络 |
能访问 V免签服务端的 /appPush 和 /appHeart |
如果目标机器上没装 Tesseract,exe 会在 OCR 那一步报错。打包 exe 不等于把 Tesseract 也带过去了。
11. 完整命令速查
安装依赖:
python -m pip install pyinstaller pytesseract requests pygetwindow pywin32 Pillow
调试版打包(带控制台):
python -m PyInstaller -F --hidden-import win32ui --hidden-import win32gui --hidden-import win32con --hidden-import PIL._tkinter_finder vmq.py
发布版打包(无控制台):
python -m PyInstaller -F -w --hidden-import win32ui --hidden-import win32gui --hidden-import win32con --hidden-import PIL._tkinter_finder vmq.py
产物位置:
C:\dist\vmq.exe
总结
打包这个脚本的流程其实不复杂:
装 PyInstaller → 补 hidden-import → 先打带控制台的版本验证 → 再打无控制台版本发布。
真正需要注意的只有两点:
- Tesseract 不会被自动打包进去,目标机器仍需单独安装,或者你得用静态编译版 + spec 文件手动内置。
- 打包不等于稳定,
pytesseract 每次起子进程的模式在长期运行下有内存泄漏和崩溃风险,真要 7×24 挂机还得换常驻引擎或加自动重启。
把这两点想清楚,剩下的就是按命令走一遍的事。
💬 评论区 0