簡體   English   中英

Python - 與子進程通信

[英]Python - communicate with subprocess

我在Win32操作系統上運行Python 2.7,但我希望編寫與平台無關的代碼。 我正在嘗試使用Python與我編寫的Java程序實時交互,並且想象管道將是最好的方法。 我的Python腳本將Java作為子進程調用。 從本質上講,Java是GUI,Python是后端。 (我不想使用Jython或wxPython,因為我只想依賴於每種語言提供的標准庫。)嘗試在兩者之間建立通信非常糟糕。 我可以使用(父)Python腳本向(子)Java類發送消息

process.stdin.write(msg)
process.stdin.flush()

但閱讀Java的輸出並沒有奏效。 我用

process.stdout.read()

但顯然,如果沒有什么可讀的,這將永遠封鎖。 並且process.communicate()不受限制,因為在子process.communicate()終止之前它不會執行任何操作。 根據我的研究,人們用來解決這個問題的一個常用方法是“使用線程”(盡管有人建議在編寫時附加換行符 - 不起作用),但是對於Python和線程新手來說我沒有想法看起來如何。 我試過查看標准庫的subprocess.py源代碼,但這沒有幫助。 有沒有辦法看到stdout是否為空,至少? 如果沒有,我該如何做到這一點?

process.stdout.read()
但顯然,如果沒有什么可讀的,這將永遠封鎖。

好吧,不完全是,它會基本阻塞,而它的讀取/等待直到它達到文件關閉時設置的EOF ,繞過這一點的一種方法是說明要讀取多少字節process.stdout.read(1) this將讀取1個字節並返回如​​果沒有字節然后再次它將等待至少一個字節或EOF

你也可以使用python select module,它有一個可選的超時周期,select選擇等待這個long或者只返回空值http://docs.python.org/library/select.html
雖然它可能不完全支持在Windows上。

(雖然有人建議在寫作時添加換行符 - 但不起作用)

我實際上是從/到python,再加上process.stdout.readline().rstrip()所以數據是一組行雖然你仍然要剝離它們,但是你可能需要刷新為了使兩個進程都注冊數據。

我確實找到了這個java:如何通過管道(stdin / stdout)讀取和寫入流程(stdin / stdout) ,這可能對你有幫助。

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM