2012-06-22 35 views
0

python程序打開C++程序的新進程並正在讀取進程stdout。 到目前爲止沒有問題。C++到python通信。多個io流?

但是有可能有多個這樣的通信流嗎?如果我濫用標準錯誤,我可以得到兩個,但不會更多。簡單的方法來破解這將使用臨時文件。有沒有更優雅的東西不需要繞過文件系統?

PS:* nix中具體的解決方案也歡迎

回答

2

在unix系統上;打開一個子進程的常用方法是使用fork(),這會在子進程和父進程中留下任何打開的文件描述符(表示打開的文件或套接字的小整數),然後允許新的可執行文件使用在舊進程中打開的文件描述符。該功能保留在subprocess.Popen()調用中(可通過參數close_fds進行調整)。因此,你可能想要做的是使用os.pipe()創建成對的套接字進行通信,然後使用Popen()啓動另一個進程,並將前一個調用返回的每個fd的參數指定爲pipe(),以告知它應該使用哪個fd 。

+0

如果你採用這種方法,你可能想看看[這個問題](http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file - 描述符)如何處理C++端的fd。 – SingleNegationElimination

0

聽起來像是你想要什麼是使用套接字進行通信。這兩種語言都允許打開原始套接字,但您可能還想查看zeromq項目,這對於消息傳遞具有一些附加優勢。在c++python中查看他們的Hello World。

0

假設windows機器。 你可以嘗試使用剪貼板來交換python進程和C++之間的信息。

指定一些獨特的進程ID後跟你的信息,並將其寫入到python端的剪貼板.....現在只需解析C++端的字符串。 它類似於使用臨時文件,但全部在內存中完成.....但缺點是你不能使用任何其他應用程序的剪貼板。 希望它有幫助

0

使用傳統的同步編程和標準Python庫,你所要求的很難完成。相反,如果您考慮使用異步編程模型和Twisted庫,那麼這是小菜一碟。 Using Processes HOWTO描述如何輕鬆地與任意多個進程進行通信。不可否認,Twisted有一些學習曲線,但它非常值得努力。