You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包后Python屏幕共享脚本异常:进程无限创建、内存飙升

问题分析与解决方案

核心错误:线程启动方式错误

你的代码中线程启动逻辑存在致命问题:

threading.Thread(target=capture_and_send_frames()).start()

这里直接调用了capture_and_send_frames()函数,而非传递函数引用。这会导致主线程直接进入while True死循环,完全没有启动新线程。在PyCharm环境中可能未触发进程异常,但打包为exe后,这种阻塞会引发程序重复启动,导致任务管理器中进程数量暴涨。

次要问题:打包依赖缺失与资源占用过高

  1. pyscreenshot依赖底层截图后端(如mss、PIL),PyInstaller默认无法自动识别这些依赖,打包后截图功能会失败,加剧进程异常。
  2. 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)的消息,避免连接异常导致的线程阻塞。

验证流程

  1. 在PyCharm中运行修正后的代码,确认控制台持续输出screenshot、captured screen等日志
  2. 用上述命令打包exe,运行后检查任务管理器进程数量正常,控制台输出稳定

内容的提问来源于stack exchange,提问作者uhm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:52:49