在 Rust 中写入子进程的标准输入?

Posted

技术标签:

【中文标题】在 Rust 中写入子进程的标准输入?【英文标题】:Write to child process' stdin in Rust? 【发布时间】:2018-08-19 11:47:43 【问题描述】:

Rust 的 std::process::Command 允许通过 stdin 方法配置进程的标准输入,但该方法似乎只接受现有文件或管道。

给定一个字节,你将如何将它写入Command 的标准输入?

【问题讨论】:

【参考方案1】:

您可以创建一个标准输入管道并在其上写入字节。

Command::output 立即关闭标准输入时,您必须使用Command::spawnCommand::spawn 默认继承标准输入。您必须使用 Command::stdin 来更改行为。

这里是示例 (playground):

use std::io::self, Write;
use std::process::Command, Stdio;

fn main() -> io::Result<()> 
    let mut child = Command::new("cat")
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .spawn()?;

    let child_stdin = child.stdin.as_mut().unwrap();
    child_stdin.write_all(b"Hello, world!\n")?;
    // Close stdin to finish and avoid indefinite blocking
    drop(child_stdin);
    
    let output = child.wait_with_output()?;

    println!("output = :?", output);

    Ok(())

【讨论】:

在我看来,删除 child_stdin 只会删除引用。但不是实际的stdin。我认为这可以通过使用 take: if let Some(mut stdin) = child.stdin.take() stdin.write_all(input.as_ref())?; // drop would happen here 来解决【参考方案2】:

您需要在创建子流程时请求使用管道。然后您可以写入管道的写入端,以便将数据传递给子进程。

或者,您可以将数据写入临时文件并指定File 对象。这样,您不必将数据分段提供给子流程,如果您还从其标准输出中读取数据,这可能会有点棘手。 (有死锁的风险。)

如果继承描述符用于标准输入,则父进程不一定具有将数据注入其中的能力。

【讨论】:

大概 OP(以及任何未来的读者)不知道 如何 做您建议的任何事情;也许你可以花时间展示工作代码?

以上是关于在 Rust 中写入子进程的标准输入?的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何写入子进程的标准输入并实时读取其输出

Python子进程将数据定向到标准输入

在 Rust 命令过程中写入 stdio 并从 stdout 读取

使用重定向的标准输入处理子进程中的 kbhit

如何将数据写入 Python shell 管道中第一个进程的标准输入?

如何在 Python 中执行将数据写入标准输入的进程?