PyInstaller打包后Python屏幕共享脚本异常:进程无限创建、内存飙升
问题分析与解决方案
核心错误:线程启动方式错误
你的代码中线程启动逻辑存在致命问题:
threading.Thread(target=capture_and_send_frames()).start()
这里直接调用了capture_and_send_frames()函数,而非传递函数引用。这会导致主线程直接进入while True死循环,完全没有启动新线程。在PyCharm环境中可能未触发进程异常,但打包为exe后,这种阻塞会引发程序重复启动,导致任务管理器中进程数量暴涨。
次要问题:打包依赖缺失与资源占用过高
pyscreenshot依赖底层截图后端(如mss、PIL),PyInstaller默认无法自动识别这些依赖,打包后截图功能会失败,加剧进程异常。while True循环无延时,导致CPU占用过高,进一步触发系统异常。
修复步骤
1. 修正线程启动代码
将线程启动行改为:
threading.Thread(target=capture_and_send_frames, daemon=True).start()
target=capture_and_send_frames:传递函数对象,而非执行函数的结果daemon=True:设置为守护线程,确保主线程退出时子线程自动终止
2. 添加循环延时
在while True循环末尾添加延时,控制帧率并降低资源占用:
import time def capture_and_send_frames(): print("confirmed func") while True: print("while loop") screenshot = ImageGrab.grab() print("screenshot") frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR) print("captured screen") send_frame_to_server(frame) time.sleep(0.03) # 约30帧/秒,可按需调整
3. 正确打包依赖
使用以下PyInstaller命令打包,确保包含所有必要依赖:
pyinstaller --onefile --hidden-import pyscreenshot.backends --hidden-import mss --hidden-import numpy your_script.py
--hidden-import:手动指定PyInstaller未自动检测到的依赖包- 若使用其他截图后端(如PIL),替换
mss为对应后端包名
4. 验证连接配置
确认SERVER_URL已正确填写,服务器端能正常接收sio.emit('frame', frame_bytes)的消息,避免连接异常导致的线程阻塞。
验证流程
- 在PyCharm中运行修正后的代码,确认控制台持续输出
screenshot、captured screen等日志 - 用上述命令打包exe,运行后检查任务管理器进程数量正常,控制台输出稳定
内容的提问来源于stack exchange,提问作者uhm
相关产品推荐
相关产品推荐

