Process 从标准输出读取数据时,不会同时将其全部放在内存中

Process 从标准输出读取数据时,不会同时将其全部放在内存中,process,rust,Process,Rust,我试图从一个在单独进程中运行的外部工具捕获输出。我希望以非阻塞方式这样做,因为输出比内存大。我看到了,但我不知道如何进行。我从中复制了一个示例,但这似乎是在继续之前将输出捕获到变量中。到目前为止,我已经: let path = "/Documents/Ruststuff/DB30_igh_badPE.bam"; let output = Command::new("samtools") .arg("view") .arg("-H") .arg(path) .std

我试图从一个在单独进程中运行的外部工具捕获输出。我希望以非阻塞方式这样做,因为输出比内存大。我看到了,但我不知道如何进行。我从中复制了一个示例,但这似乎是在继续之前将输出捕获到变量中。到目前为止,我已经:

let path = "/Documents/Ruststuff/DB30_igh_badPE.bam";
let output = Command::new("samtools")
    .arg("view")
    .arg("-H")
    .arg(path)
    .stdin(Stdio::piped())
    .stdout(Stdio::piped())
    .spawn()
    .unwrap_or_else(|e| panic!("failed {}", e));

let mut s = String::new();
match output.stdout.unwrap().read_to_string(&mut s) {
    Err(why) => panic!("{}", Error::description(&why)),
    Ok(_) => print!("{}", s),
}
是否可以从子进程循环
stdout
,而不使用匹配?比如:

for line in &output.stdout {}

你不需要非阻塞IO来满足你的需求。您可以简单地使用在输入行上循环。这假设您总是需要一个完整的行,并且完整的行不是太多的数据:

use std::process::{Command, Stdio};
use std::io::{BufRead, BufReader};

fn main() {
    let mut child = Command::new("yes")
        .stdout(Stdio::piped())
        .spawn()
        .expect("Unable to spawn program");

    if let Some(ref mut stdout) = child.stdout {
        let lines = BufReader::new(stdout).lines().enumerate().take(10);
        for (counter, line) in lines {
            println!("{}, {:?}", counter, line);
        }
    }
}

为自身实现
读取
,但不为不可变引用(
&ChildStdout
)实现。虽然我们拥有这个标准,但我们不想使用它,所以我们需要某种引用。是为对任何其他类型的可变引用而实现的,该类型本身是
Read
,因此我们切换到可变引用。然后,子级也需要是可变的。

您不需要非阻塞IO来满足您的需要。您可以简单地使用在输入行上循环。这假设您总是需要一个完整的行,并且完整的行不是太多的数据:

use std::process::{Command, Stdio};
use std::io::{BufRead, BufReader};

fn main() {
    let mut child = Command::new("yes")
        .stdout(Stdio::piped())
        .spawn()
        .expect("Unable to spawn program");

    if let Some(ref mut stdout) = child.stdout {
        let lines = BufReader::new(stdout).lines().enumerate().take(10);
        for (counter, line) in lines {
            println!("{}, {:?}", counter, line);
        }
    }
}

为自身实现
读取
,但不为不可变引用(
&ChildStdout
)实现。虽然我们拥有这个标准,但我们不想使用它,所以我们需要某种引用。是为对任何其他类型的可变引用而实现的,该类型本身是
Read
,因此我们切换到可变引用。然后
child
也需要是可变的。

嗯,我想知道是否有像捕获生成的输出这样简单的东西。例如,在python中,您设置了一个正在运行的进程,您可以使用进程中的stdout=PIPE和“for line In sys.stdin”将输出捕获到父脚本中,如果这样做有意义的话……我想知道是否有像捕获生成的输出这样简单的事情。例如,在python中,您设置了一个正在运行的进程,您可以使用进程中的stdout=PIPE和“for line In sys.stdin”将输出捕获到父脚本中(如果有意义的话)。。。