2013-02-11 58 views
0

我需要調用進程中的交互式程序並在進程運行時打印其輸出。到目前爲止,我與這個功能做:如何調用交互式程序並立即顯示輸出

def call(command): 
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

    while True: 
     line = process.stdout.readline().rstrip().encode("utf-8") 
     if line == '': 
      break 

     print(line) 

    process.wait() 
    return process.returncode 

的問題是,交互式程序可以等待用戶輸入和問題後,不會增加新的線路,例如:

認證領域:...> ...

用戶名:

後 「用戶名」,有沒有新的生產線和程序期望的用戶輸入,所以我的代碼d oes不顯示「用戶名:」。

而不是readline()我需要一些像bytesavailable和read(size)這樣的函數,但是沒有像bytesavaiable()這樣的函數。

+0

改爲使用'communic'。它也避免了緩衝問題(由於管道已滿而導致程序卡住)。 – Cameron 2013-02-11 00:13:35

+1

@Cameron'communic'只有在程序終止前不需要輸出時纔有效(因爲它只在處理完成後才返回)。 – Amber 2013-02-11 00:14:28

+0

@Amber:嗯,我可以發誓它是非阻塞的,但文檔顯示你是對的:-) – Cameron 2013-02-11 00:53:20

回答

3

您是否需要爲自己捕獲程序的輸出,或者您是否需要將它顯示給用戶?如果它只是需要顯示,考慮只讓過程中直接將其寫入標準輸出:

process = subprocess.Popen(command, shell=True) 

這巧妙地避免了需要破解了一下自己的直通解決方案。


如果需要捕捉程序的輸出,你可以叫.read()不指定大小。它會阻塞,直到它有一些數據要讀取(或者直到流完成,在這種情況下,它會返回一個空字符串),但它不一定會等到一行返回的結束,不像.readline()

+0

謝謝!我只需要顯示它,所以我的版本肯定是過度設計的... – osiris81 2013-02-11 00:58:57

相關問題