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

如何检测子进程是否被用户终止?现有代码始终卡在Processing video输出

问题分析与解决

核心问题

你的代码存在两个关键问题,导致无法检测终端被用户关闭的情况:

  1. 循环提前终止:while循环里的break语句让代码仅打印一次Processing video...就跳出循环,完全不会持续检查进程状态,后续的else分支根本没有执行机会。
  2. 进程跟踪失效:使用start cmd /k时,subprocess.Popen启动的是Windows的start命令,这个命令会立即退出(returncode为0),而实际的终端窗口和ffmpeg进程是独立启动的,主进程无法跟踪它们的运行状态。

修正后的代码

import subprocess
import time
import ffmpeg

# 生成ffmpeg执行命令
cmd = ' '.join(ffmpeg.compile(output_stream, overwrite_output=True))
# 直接启动cmd窗口执行ffmpeg,用/c参数让cmd执行完命令后自动关闭窗口
# 用引号包裹命令,避免命令含空格时出现拆分错误
compressing = subprocess.Popen(f'cmd /c "{cmd}"', shell=True)

while compressing.poll() is None:
    print('Processing video...')
    time.sleep(1)  # 添加延时,避免控制台被频繁输出刷屏
else:
    if compressing.returncode == 0:
        print('Video processing complete!')
    else:
        # 用户关闭终端或ffmpeg异常终止时,returncode会是非0值(通常为负数)
        print('Video processing canceled by user!')

关键修改说明

  • 移除while循环内的break,改为每隔1秒检查一次进程状态,既保证能实时跟踪进程,又避免控制台被刷屏。
  • 替换start cmd /k为cmd /c "{cmd}":/c参数让cmd执行完ffmpeg命令后自动关闭窗口,且subprocess.Popen可以直接跟踪这个cmd进程的状态;如果需要执行完命令后保持窗口,可改用/k参数,此时用户手动关闭窗口时,cmd进程会返回非0的returncode。
  • 修正returncode判断逻辑:进程正常完成时returncode为0,用户关闭终端或进程异常终止时returncode为非0值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:30:13