2016-07-27 25 views
0

Ich versuche eine Funktion zum Erstellen einer Shell-Pipeline in einer Schleife zu schreiben, die ihre Befehlsparameter aus einer Liste erhält und das letzte stdout an die neue stdin leitet. In der und der Befehlsliste möchte ich die Kommunikationsmethode auf dem Popen-Objekt aufrufen, um die Ausgabe zu erhalten.Python popen pipe in Schleife

Der Ausgang ist immer leer. Was mache ich falsch?

Siehe folgendes Beispiel:

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] 

ich mit weiteren Unix-Funktionen auf einer Windows-Umgebung bin. Nach Befehl funktioniert auf meiner Windows-Befehlszeile und soll strProcessInfo geschrieben werden:

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

Antwort

0

Das Problem ist mit grep% SITZUNGS%. Wenn Sie dasselbe auf der Kommandozeile ausführen, wird der% SESSIONNAME% tatsächlich durch "Console" ersetzt. Wenn es jedoch im Python-Skript ausgeführt wird, wird es nicht ersetzt. Es wird versucht, genau den% SESSIONNAME% zu finden, der nicht vorhanden ist. Aus diesem Grund ist die Ausgabe leer.

Unten ist Code.

Grep ersetzt durch findstr und % SITZUNGS% Wort ersetzt "Console".

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 

Ausgang:

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


C:\Users\dinesh_pundkar\Desktop> 

Bitte lassen Sie mich wissen, ob es hilfreich ist.

+1

Ich ersetzte nur ** Konsole ** von ** os.environ ["SESSIONNAME"]) ** aber es hat gut funktioniert. Vielen Dank! –