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”将输出捕获到父脚本中(如果有意义的话)。。。