gpt4 book ai didi

process - 从进程 stdout 中读取,而不是一次将其全部放入内存

转载 作者:行者123 更新时间:2023-11-29 08:11:39 25 4
gpt4 key购买 nike

我正在尝试从在单独进程中运行的外部工具捕获输出。我想以非阻塞的方式这样做,因为输出大于内存。我看到了How would you stream output from a Process in Rust?但我不确定如何进行。我从 here 复制了一个例子但这似乎在继续之前将输出捕获到变量中。到目前为止,我有:

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 来满足您的需求。您可以使用 a buffered reader遍历输入行。这假设您始终需要完整的一行,并且完整的一行不会有太多数据:

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

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

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

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

关于process - 从进程 stdout 中读取,而不是一次将其全部放入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com