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
相关产品推荐
相关产品推荐

