如何检测子进程是否被用户终止?现有代码始终卡在Processing video输出
问题分析与解决
核心问题
你的代码存在两个关键问题,导致无法检测终端被用户关闭的情况:
- 循环提前终止:
while循环里的break语句让代码仅打印一次Processing video...就跳出循环,完全不会持续检查进程状态,后续的else分支根本没有执行机会。 - 进程跟踪失效:使用
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
相关产品推荐
相关产品推荐

