2012-11-02 80 views
2

我實現了一個使用subprocess.Popen執行從服務器到Ubuntu客戶端的命令的python程序。子進程必須逐行讀取所有輸出。 我的程序在Eclipse環境中完美運行。所有輸出按照我的預期打印。 但是,當我在Python交互式shell(在Windows和Linux)下運行程序時,subprocess.Popen沒有讀取所有命令輸出。輸出只顯示很少,然後Python崩潰沒有任何錯誤。這是我的程序代碼:Python子進程無法讀取shell中的所有輸出

def execute(self, IP_Instance, command): 

    keypairs_directory = Config.keypairs_directory 

    cmd = 'ssh [email protected]%s'%IP_Instance+' -i %s'%keypairs_directory+' %s'%command 

    cmd_run = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) 
    for line in cmd_run.stdout: 
     print line   
    cmd_run.wait() 

例如,當我發送一個命令:

a.execute('xxx.xxx.xxx.xxx', 'ls -l') 

我有輸出

total 0 

這是確定。但是,當我派:

a.execute('xxx.xxx.xxx.xxx', 'sudo apt-get update') 

程序只運行到

Fetched 8,364 kB in 6s (1,205 kB/s) 
Reading package lists... 

,然後Python的背朝

>>> 

我曾試過通信()[0],則poll(),但他們沒有帶來效果。我爲所有機器使用Python 2.7。我究竟做錯了什麼?

+1

如何返回到交互式提示映射到「崩潰沒有任何錯誤」?如果您返回cmd_run.wait()',那麼返回代碼是什麼? – eryksun

回答

2

apt-get update命令返回的數據也是在標準錯誤,所以你也需要趕上stderr數據:

subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 

,然後你必須同時使用Popen.stdoutPopen.stderr

+0

感謝您的快速回答。我剛剛嘗試過,但不幸的是結果仍然相同。 –

+1

'stderr = subprocess.STDOUT'會重定向'stderr'。 – eryksun

+0

我得到相同的輸出。此外,我嘗試其他打印長輸出的命令,並且該程序也無法讀取以打印全部。例如sudo apt-get install -y mc。但是,在Eclipse中,所有操作都是精確的。 –