2017-07-31 171 views
0

我想从Python程序中产生一个Rust进程,并将Python的标准输出重定向到它的标准输入中。我已经使用了以下功能:如何将输出从Python进程重定向到Rust进程?

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 

我没有收到拉斯特任何错误,但标准输入似乎没有采取任何输入标准输出根本不打印任何东西。

这里是我目前运行锈代码的版本:

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"};  

} 
+1

有人可能会对您的问题提出更直接的回答,但同时请让我建议[ØMQ](http://zeromq.org/)满足所有进程间通信需求。它附带了[Python](https://github.com/zeromq/pyzmq)和[Rust](https://github.com/erickt/rust-zmq)的绑定。 – kazemakase

+0

听起来不错。我已经把你的问题转移到了帖子的标题上,这是Stack Overflow所在的位置。接下来,我鼓励你编辑你的问题,以包含重要的信息:程序*做什么*以及你期望它做什么。 – Shepmaster

+0

*我一直无法找到任何使用文件描述符打开管道的方法。* - 除了您的代码**显示您做了**:'pipe_in = unsafe {Stdio :: from_raw_fd(fd)}; let mut my_pipe = Pipe :: new(); my_pipe.reader = pipe_in;'。 – Shepmaster

回答

0

process.stdin.write(str.encode(json.dumps(dictionnaire[str(index)]))默认情况下不会添加换行符,所以在锈色方面,我从来没有到达在read_line上制作进程块的那一行的末尾。

手动添加它使一切顺利。

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

这可能是在Python端的问题

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

这是假设你有一个数字文件描述符在forkexec之间保持打开状态。产卵过程可能会关闭文件描述符,因为它们被标记为CLOEXEC或由于exec之前的显式清除代码。

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

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

+0

这实际上就是我想要做的..在新进程中打开fd的句柄。问题是我找不到任何在Rust中执行的API。然后我尝试了你的第二种方法。请阅读下面我刚发布的答案。谢谢 –

+2

问题的关键是,如果在产生子进程时它在python端被关闭,那么在子进程中不会打开fd。 – the8472

相关问题