【问题标题】:How can I redirect outputs from a Python process into a Rust process?如何将 Python 进程的输出重定向到 Rust 进程?
【发布时间】:2018-01-07 03:20:34
【问题描述】:

我正在尝试从 Python 程序生成 Rust 进程并将 Python 的标准输出重定向到其标准输入。我使用了以下功能:

process = subprocess.Popen(["./target/debug/mypro"], stdin=subprocess.PIPE)

并尝试使用以下方式写入子进程:

process.stdin.write(str.encode(json.dumps(dictionnaire[str(index)]))) #Write bytes of Json representation of previous track

我没有收到任何错误,但 Rust 中的标准输入似乎没有接受任何输入,标准输出根本没有打印任何内容。

这是我当前运行的 Rust 代码版本:

extern crate rustc_serialize;
use rustc_serialize::json::Json;
use std::fs::File;
use std::io;
use std::env;
use std::str;

fn main(){
    let mut buffer = String::new();
    let stdin = io::stdin();
    //stdin.lock();
    stdin.read_line(&mut buffer).unwrap();
    println!{"{}", buffer};
    println!{"ok"};      

}

【问题讨论】:

  • 有人可能会对您的问题提出更直接的答案,但同时让我建议ØMQ 满足您的所有进程间通信需求。它带有PythonRust 的绑定。
  • 听起来不错。我已将您的问题移至帖子的标题,这是它在 Stack Overflow 上的所属位置。接下来,我鼓励您在edit 您的问题中包含重要信息:程序做什么 以及您期望 它做什么。
  • “这根本不起作用” - 然后发布错误或您遇到的任何问题?不要让其他人复制你已经做过的尝试。
  • 这不是使用fork 的正确方法。你应该 fork 然后 exec 替换子进程。相反,您正在调用 subprocess.run,它会执行自己的 fork+exec 并启动外部进程。您的文件描述符在该过程中将无效。

标签: python rust ipc file-descriptor pipelining


【解决方案1】:

process.stdin.write(str.encode(json.dumps(dictionnaire[str(index)])) 默认情况下不添加换行符,因此在 Rust 方面,我从未到达导致 read_line 上的进程阻塞的行尾。

手动添加让一切顺利。

process.stdin.write(str.encode(json.dumps(dictionnaire[str(index)])+ "\n") )

【讨论】:

    【解决方案2】:

    这可能是 Python 端的问题

    subprocess.run(["cargo run -- " + str(r)], shell=True)
    

    这假设您有一个在forkexec 中保持打开状态的数字文件描述符。生成进程可能会关闭文件描述符,因为它们被标记为 CLOEXEC 或由于 exec 之前的显式清理代码。

    在尝试将数字文件描述符作为字符串参数传递之前,您应该确保它们在新进程中仍然有效。

    更好的方法是使用一些进程生成 API,它允许您将新进程中的文件描述符显式映射到打开句柄,或者使用 API 生成一个与管道绑定的 stdin/out 进程。

    【讨论】:

    • 这实际上是我试图做的......在新进程中打开 fd 的句柄。问题是我在 Rust 中找不到任何 API。然后我尝试了你的第二种方法。请阅读我刚刚在下面发布的答案。谢谢
    • 重点是,如果子进程在生成子进程时在python端关闭,则子进程中没有要打开的fd。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 2017-06-25
    • 2021-03-25
    • 2017-10-12
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多