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

PyInstaller打包exe后进程无限克隆且无法截图问题求助

解决PyInstaller打包截图脚本后进程无限克隆的问题

问题核心原因

你的脚本在控制台运行正常,但打包为exe后出现进程无限克隆、无法生成截图,主要是两个因素叠加导致:

  1. pyscreenshot库依赖系统底层的第三方截图工具,PyInstaller单文件打包时的临时文件提取机制,会触发该库重复启动新进程,和你的无限循环逻辑叠加后引发进程爆炸。
  2. schedule的无限循环逻辑,在打包后的exe进程中,和PyInstaller的子进程处理逻辑冲突,进一步加剧了进程克隆问题。

解决方案

方案1:替换截图库为mss(推荐,打包兼容性更强)

mss是轻量级跨平台截图库,无需依赖外部工具,打包后稳定性更高。修改后的代码如下:

import time
from mss import mss
from datetime import datetime
import schedule

def take_screenshot():
    print("Taking screenshot...")
    # 用strftime直接生成合法文件名,避免手动替换字符
    image_name = f"screenshot-{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png"
    # mss截图并保存
    with mss() as sct:
        sct.shot(output=image_name)
    print(f"Screenshot saved to {image_name}")
    return image_name

def main():
    # 注意:原代码写的600秒是10分钟,若需要5分钟请改为300秒
    schedule.every(300).seconds.do(take_screenshot)
    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == '__main__':
    main()

方案2:调整打包参数+修改原代码(保留pyscreenshot)

如果坚持使用pyscreenshot,可以通过以下方式修复:

  1. 打包参数调整:
    • 优先使用文件夹模式打包(避免单文件模式的临时文件问题):
      pyinstaller --onedir your_script.py
      
    • 若必须单文件打包,添加参数排除不必要依赖并禁用控制台(可选):
      pyinstaller --onefile --noconsole --exclude-module tkinter your_script.py
      
  2. 代码添加防重复启动逻辑:
    在if __name__ == '__main__':块中加入判断,避免子进程重复执行主循环:
    if __name__ == '__main__':
        import sys
        # 防止PyInstaller打包后子进程重复启动主逻辑
        if sys.argv[0].endswith('.exe') and '--child' not in sys.argv:
            main()
    

额外注意事项

  • 确认打包前已安装所有依赖:pip install pyscreenshot schedule mss
  • 测试打包后的exe时,尽量用普通用户权限运行,避免权限不足导致截图失败
  • 若不需要控制台输出,打包时添加--noconsole参数可避免弹出黑窗口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:10:09