gpt4 book ai didi

rust - 如何将输入发送到使用Command创建的进程的stdin并捕获输出(和状态)

转载 作者:行者123 更新时间:2023-12-03 11:42:50 26 4
gpt4 key购买 nike

我希望使用Command创建一个子进程,从我创建的另一个子进程中将其输入stdin,然后等待并捕获输出。
我还看到了有关一个或另一个的其他问题和答案,但没有两者兼而有之。
我正在尝试的顺序是:

  • 创建目标子命令,stdin为Piped()
  • 使用spawn()生成 child 并让 child 返回
  • 从Child获得'stdin'字段以与缓冲区编写器
  • 一起使用
  • 使用stdout Piped()生成数据处理的源
  • 将源标准输出的输出循环到目标
  • 的标准输入
  • 然后尝试使用wait_with_output()捕获目的地的输出

  • 最后一步没有编译,因为它说当我得到stdin时,Child对象已移动(消耗)。
    游乐场 link

    最佳答案

    您需要获得dest_child.stdin管道的所有权,才能将对象赋予BufWriter::new。由于管道位于Option内部,因此您可以使用 Option::take 将其移出,而无需将dest_child保留为“部分移动”。您的代码的另一个问题是dest.stdin必须通过管道传递而不是继承,否则dest_child.stdin将仅保留为None。进行这些更改后,您的代码将编译并运行(playground)。
    但是请注意,无需手动将数据从一个进程传输到另一个进程,OS完全有能力自行执行此操作。例如(playground):

    use std::process::{Command, Stdio};

    fn main() {
    let mut dest = Command::new("wc")
    .stdin(Stdio::piped())
    .stdout(Stdio::piped())
    .spawn()
    .unwrap();
    let _source = Command::new("ls")
    .stdout(dest.stdin.take().unwrap())
    .spawn()
    .unwrap();
    let dest_output = dest.wait_with_output().unwrap();

    match dest_output.status.code() {
    Some(0) => println!("OK: {}", String::from_utf8_lossy(&dest_output.stdout)),
    Some(code) => println!("Error {}", code),
    None => {}
    }
    }

    关于rust - 如何将输入发送到使用Command创建的进程的stdin并捕获输出(和状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63935315/

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