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

如何在执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:05:40