2016-07-27 124 views
0

我試圖編寫一個函數來創建一個循環中的shell管道,它從列表中獲取其命令參數並將最後一個stdout傳遞給新的stdin。 在命令列表中,我想調用Popen對象的通信方法來獲取輸出。python popen pipe in loop

輸出總是空的。我究竟做錯了什麼?

見下面的例子:

lstCmd = ["tasklist", "grep %SESSIONNAME%", "grep %s" % (strAutName)] 
lstPopen = [subprocess.Popen(lstCmd[0].split(), stdout=subprocess.PIPE)] 
    for i in range(len(lstCmd) - 1): 
     lstPopen.append(subprocess.Popen(lstCmd[i + 1].split(), stdin=lstPopen[i].stdout, stdout=subprocess.PIPE)) 
     lstPopen[i].stdout.close() 
strProcessInfo = lstPopen[-1].communicate()[0] 

我在Windows環境下的其他UNIX的功能。以下命令適用於我的Windows命令行,並應寫入strProcessInfo:

C:\>tasklist | grep %SESSIONNAME% | grep tasklist 
tasklist.exe     18112 Console     1   5.948 K 

回答

0

問題在於grep%SESSIONNAME%。當你在命令行執行同樣的事情時,%SESSIONNAME%實際上被「控制檯」取代。 但是,當在python腳本中執行時,它不會被替換。它試圖找到不存在的確切%SESSIONNAME%。這就是輸出爲空的原因。

以下是代碼。

grep的取代由字「控制檯」取代FINDSTR%SESSIONNAME%

import sys 
import subprocess 

lstCmd = ["tasklist", "findstr Console","findstr tasklist"] 
lstPopen = [subprocess.Popen(lstCmd[0].split(), stdout=subprocess.PIPE)] 
for i in range(len(lstCmd) - 1): 
    lstPopen.append(subprocess.Popen(lstCmd[i + 1].split(), stdin=lstPopen[i].stdout, stdout=subprocess.PIPE)) 
    lstPopen[i].stdout.close() 

strProcessInfo = lstPopen[-1].communicate()[0] 
print strProcessInfo 

輸出:

C:\Users\dinesh_pundkar\Desktop>python abc.py 
tasklist.exe     12316 Console     1  7,856 K 


C:\Users\dinesh_pundkar\Desktop> 

請讓我知道,如果它是有幫助的。

+1

我剛剛** ** os.environ [「SESSIONNAME」])**取代**控制檯**,但它工作正常。謝謝! –