2017-07-31 169 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

相關問題