【问题标题】:What is the best way to stream stdout from a Process, in Dart?在 Dart 中从 Process 流式传输标准输出的最佳方法是什么?
【发布时间】:2015-10-21 04:46:23
【问题描述】:

我想运行一个进程,并将进程的标准输出流式传输到控制台。最好(最有效、最容易理解、代码行最少)的方法是什么?

例如:

var process = await Process.start(exec, args);

我想尽快查看任何可用的标准输出内容。

谢谢!

【问题讨论】:

    标签: dart dart-io


    【解决方案1】:
    import 'dart:io';
    void main() async {
       var process = await Process.start(exec, args);
       process.stdout.pipe(stdout);
    }
    

    或者使用then:

    import 'dart:io';
    void main() {
       Process.start(exec, args).then(
          (process) => process.stdout.pipe(stdout)
       );
    }
    

    https://api.dart.dev/dart-async/Stream/pipe.html

    【讨论】:

    • 不知道这个和addStream有什么优缺点?
    • .pipe() 本身只是调用了addStream() ;-),但是另外,当源流无错误关闭时,它也会自动关闭目标流。
    • 如果它在您的流程完成之前关闭您的流程的标准输出流,这不会做一些意想不到的事情吗?
    • 你不能关闭它,因为控制器是进程私有的。您可以做的是停止收听,这不会产生任何影响,除非不会在流上获得进一步的输出。
    【解决方案2】:

    这是一种方法:

    var process = await Process.start(exec, args);
    stdout.addStream(process.stdout);
    

    请注意,我将process.stdout 流添加到来自dart:io 的普通stdout 流中。

    【讨论】:

      【解决方案3】:

      为了完整起见,您可以在Process.start 中使用mode 参数并传递ProcessStartMode.inheritStdio

      var process = await Process.start(
        command,
        args,
        mode: ProcessStartMode.inheritStdio
      );
      

      但请注意,正如模式名称所暗示的那样,这会将所有 stdio 从进程(stdin、stdout 和 stderr)传递到默认 stdout,这可能会导致意外结果,因为也会传递 sigterms 之类的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多