【问题标题】:Dart :: Process.run() get stdout as stream instead of String, just like Process.start()Dart :: Process.run() 将标准输出作为流而不是字符串,就像 Process.start()
【发布时间】:2021-04-30 18:19:11
【问题描述】:

我想使用 Process.run()Process.start() 在 dart 中一一执行一些进程

我想显示该过程的详细日志。但问题是每当我使用run 时,它都会在字符串中提供标准输出,即在流程完成结束时。但我想在进程执行时显示日志。

因为run返回给我们的是ProcessResult的实例而不是Process,所以返回的stdout是String。

如果是run,则必须使用stdout.write(cleanProcess.stdout);

现在,如果 start(),我将 stdout 作为 Stream,这是所需的,但唯一的问题是 start 将我们返回到 Process 并且实际上并没有 await 以完成流程。

可以使用stdout.addStream(buildProcess.stdout); 将标准输出显示为流


我尝试执行的代码,并显示详细信息。

    print("HighSupply Executor : flutter clean");
    var cleanProcess = await Process.run('flutter', ["clean", "--verbose"],
        workingDirectory: "${flutterFolder.path}");
    stdout.write(cleanProcess.stdout); //only getting stdout in one go. needed as stream.

    print("HighSupply Executor : flutter pub get");
    var pubGetProcess = await Process.run('flutter', //OR can we use start and wait for process to complete
        ["pub", "get", "--verbose"],
        workingDirectory: "${flutterFolder.path}");
    stdout.write(pubGetProcess.stdout);

    print("HighSupply Executor : flutter build apk");
    var buildProcess = await Process.run(
        'flutter', ["build", "apk", "--verbose", generatedParams],
        workingDirectory: "${flutterFolder.path}");
    stdout.write(buildProcess.stdout);

TL;DR

Prcocess.run() 的情况下,我可以将stdout 作为流获取吗?或者,在Process.start() 的情况下,我们可以等待进程完成后再执行另一个进程吗

感谢任何帮助。

编辑:1

正如@julemand101 建议使用exitcode 并等待它在流程完成后返回,它适用于我的情况,并且还没有遇到任何问题,但正如他在文档中提到和陈述的那样可靠,因此我们正在为其寻找更好的具体解决方案。

【问题讨论】:

  • 天才@julemand101 感谢您的帮助。它起作用了:)你能不能把它作为答案,以便我接受它。
  • 我删除了我的评论,因为它有点复杂。如果您阅读exitCode 的文档,您可以在底部看到:“当返回的future 完成时,不能保证stdout 和stderr 已完成报告进程的缓冲输出。要确保捕获所有输出,请稍候用于流上的 done 事件。”
  • 由于我现在真的没有时间制定防弹解决方案,所以我最终删除了我的评论。 :)
  • 没问题,无论如何感谢您的帮助。现在它对我有用,但让我们等待具体的解决方案或更多输入(如果有人有的话)。
  • @julemand101 你能和我分享一下解决方案吗?我也在寻找一种在进程运行时流式传输日志的方法。我正在使用 process.run 执行一个测试套件,我必须等待 3 个小时才能看到整个输出:(

标签: dart


【解决方案1】:

来源:Process

Process.start() 用于与代码交互。 future 给了我们一个 Process,在它完成启动之后,但是当我们有这个 Process 时,这个 Process 还在运行。

当future完成时,进程开始,你的代码可以与进程交互:写入stdin,监听stdout,等等

现在我们可以以Process.stdout 的形式访问整数流,并使用 utf8 解码器对其进行解析。

示例代码:

main() async {
  var process = await Process.start('cat', []);
  process.stdout
      .transform(utf8.decoder)
      .forEach(print);
  process.stdin.writeln('Hello, world!');
  process.stdin.writeln('Hello, galaxy!');
  process.stdin.writeln('Hello, universe!');
}

在这个答案的范围之外,我们可以操作进程对象、发送中断、杀死等,当进程结束时,期望在流上得到一个 done 事件。

【讨论】:

  • 这与使用 stdout.addStream(buildProcess.stdout) 的行为相同。我有些想等待上一个过程完成或在此过程中显示详细信息以防出现'run
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2017-05-18
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多