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

Flutter/Dart启动Process无法捕获INFO日志等全部输出如何解决?

问题原因

你当前只监听了进程的stdout(标准输出流),绝大多数命令行工具会遵循Unix程序输出约定:

  • 最终运行结果(比如你拿到的JSON输出)会输出到stdout
  • 运行过程中的日志(INFO、DEBUG、WARNING等级别日志)、错误信息会输出到stderr(标准错误流)
    你需要的INFO日志属于后者,所以只监听stdout无法捕获。

解决方案

同时监听进程的stdout和stderr两个流即可拿到全部输出,可选配置PYTHONUNBUFFERED环境变量避免Python进程输出缓冲导致日志延迟丢失。

完整实现代码

import 'dart:convert';
import 'dart:io';

void main() async {
  Process process = await Process.start(
      "cwltool",
      [
          "--verbose",
          "Oesophageal-varices.cwl",
          "Oesophageal-varices-inputs.yml"
      ],
      // 禁用Python输出缓冲,确保日志实时输出
      environment: {"PYTHONUNBUFFERED": "1"},
  );

  // 处理标准输出流:主要是最终返回的JSON结果
  process.stdout
      .transform(utf8.decoder)
      .listen((output) {
          print("stdout 输出:\n$output");
          // 在这里处理JSON结果对应的业务逻辑
      });

  // 处理标准错误流:包含你需要的INFO级别运行日志
  process.stderr
      .transform(utf8.decoder)
      .listen((log) {
          print("stderr 输出(含INFO日志):\n$log");
          // 在这里解析INFO日志,执行对应的业务逻辑
      });

  // 等待进程执行完成,获取退出状态码
  int exitCode = await process.exitCode;
  print("进程执行结束,退出码:$exitCode");
}

可选:合并流统一处理

如果你不需要区分输出来自stdout还是stderr,可以用async包的StreamGroup合并两个流统一处理:

import 'package:async/async.dart';

// 合并两个输出流
Stream<String> allOutput = StreamGroup.merge([
  process.stdout.transform(utf8.decoder),
  process.stderr.transform(utf8.decoder),
]);

allOutput.listen((content) {
  print("进程输出:$content");
  // 统一处理所有输出内容
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:15:01