2017-09-16 47 views
2

我正在尋找使用Python 3.5交互式命令行應用程序的接口。我的想法是,我在Python腳本的開始處開始這個過程,並將其打開。在一個循環中,我打印一個文件路徑,然後是一個線返回,到stdin,等待它處理四分之一秒左右,並從stdout讀取,直到它到達一個換行符。Python子進程:打印到stdin,讀取stdout直到換行,重複

這與subprocesscommunicate功能非常相似,但我正在等待換行而不是等待進程終止。任何人都知道一個相對簡單的方法來做到這一點?

編輯:如果可能,最好使用標準庫來執行此操作,而不是第三方庫,如pexpect

+4

你看過'pexpect'模塊嗎? –

+0

@JonClements我以前用過SSH。不過,我會研究它。謝謝! –

+0

尚未...使用'pexpect'。這有巨大的複雜性,這就是爲什麼不能推薦使用標準庫的原因。 –

回答

2

您可以對此使用subprocess.Popen。

事情是這樣的:

proc = subprocess.Popen(['my-command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

現在proc.stdinproc.stdout是你將數據發送到子標準輸入,並從子標準輸出讀取管道的末端。

由於您只想讀取換行符終止的行,因此您可能會解決由緩衝引起的任何問題。緩衝是使用子進程與交互過程進行通信時的一個重要問題。通常I/O是行緩衝的,這意味着如果子進程沒有用換行符終止一行,您可能永遠不會看到proc.stdout上的任何數據,反之亦然,您可以通過寫入proc.stdin - 如果您不以換行符結束。您可以關閉緩衝區,但這並不是那麼簡單,並且不是平臺獨立的。

您可能需要解決的另一個問題是,您無法確定子進程是否正在等待輸入,或者是否已通過寫入和讀取管道來發送輸出。因此,您可能需要啓動第二個線程,以便您可以等待proc.stdout上的輸出並同時寫入proc.stdin而不會發生死鎖,因爲兩個進程都在管道I/O上阻塞(或者,如果您使用的是Unix支持使用文件句柄選擇,使用select來確定哪些管道準備好接收或準備從中讀取)。

0

這聽起來像是一個事件循環的工作。 subprocess模塊在複雜任務下開始顯示其應變。

我做這個有扭曲,通過繼承如下:

twisted.internet.endpoints.ProcessEndpoint 
twisted.protocols.basic.LineOnlyReceiver 

爲Twisted的大部分文件使用套接字作爲終點,但它並不難調整過程的代碼。

相關問題