如何在执行subprocess.check_output时等待特定字符串输出?
解决Python脚本捕获wget输出并等待特定内容的问题
问题根源
wget的默认输出(包括下载进度、"saved"完成提示)是输出到标准错误流(stderr),而你用的subprocess.check_output仅捕获标准输出流(stdout),所以根本拿不到包含"saved"的内容,导致后续判断失效且无输出。
可行解决方案
方案1:合并标准错误与标准输出,一次性捕获结果
使用subprocess.run替代check_output,将stderr合并到stdout,同时捕获输出并转为文本格式,方便后续判断:
import subprocess # 执行wget命令,合并stderr到stdout,捕获文本输出 result = subprocess.run( ["wget", "--downloadlink--"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 获取完整输出 output = result.stdout print(output) # 判断下载完成标识 if "saved" in output: print("Download completed!!") # 可选:检查命令执行是否成功 if result.returncode == 0: print("命令执行成功") else: print("命令执行失败")
方案2:实时监控输出,出现目标内容立即触发后续任务
如果需要在下载过程中实时检测输出(比如大文件下载不想等结束再处理),可以用subprocess.Popen逐行读取输出:
import subprocess # 启动wget进程,开启行缓冲以便实时读取 process = subprocess.Popen( ["wget", "--downloadlink--"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1, universal_newlines=True ) # 逐行读取输出 for line in process.stdout: print(line, end='') # 实时打印原始输出 if "saved" in line: print("\nDownload completed!!") # 在这里添加你需要执行的后续任务代码 # 等待进程执行完毕 process.wait()
方案3:简化wget输出,减少干扰
使用wget的-nv(非冗余模式)或-q(安静模式)参数,让输出更简洁,更容易定位"saved"标识:
import subprocess # 使用-nv参数简化wget输出 result = subprocess.run( ["wget", "-nv", "--downloadlink--"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) output = result.stdout print(output) if "saved" in output: print("Download completed!!")
内容的提问来源于stack exchange,提问作者sbehera
相关产品推荐
相关产品推荐

