2017-02-17 7 views
0

Normalerweise verwende ich sehr einfach subprocess.check_output:Python check_output druckt aber nicht speichert in var

process = subprocess.check_output("ps aux", shell=True) 
print process #display the list of process 

Wenn ich fürchte, es ist etwas in stderr ist, verwende ich es wie folgt aus:

process = subprocess.check_output("ps aux 2> /dev/null", shell=True) 
print process #display the list of process 

Aber ich habe ein Problem mit nginx -V:

modules = subprocess.check_output("nginx -V", shell=True) #display the result 
print modules #empty 

modules = subprocess.check_output("nginx -V 2> /dev/null", shell=True) #display nothing 
print modules #empty 

Warum ist der Befehl nginx -V Verhalten sich anders (alle Drucken in stderr)? Wie kann ich einen Workaround mit "subprocess.check_output" erstellen?

+0

zum Umschalten Es könnte sein, dass ein Prozess speziell an das Terminal Druck wird es ausgeführt wird, auf statt der normalen Kanäle. – languitar

Antwort

0

Die Möglichkeit, Standardfehler auf Standardausgabe in der Shell umzuleiten, ist 2>&1, aber Sie würden gut tun, die Verwendung der Shell überhaupt hier zu vermeiden.

p = subprocess.Popen(['nginx', '-V'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = p.communicate() 
if out == '': 
    modules = err 
modules = out 

Wenn Sie eine neuere Python haben, sollten auch subprocess.run()

+0

Siehe auch http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess/36008455#36008455 für eine allgemeine Diskussion darüber, warum man 'shell = True' vermeiden sollte. – tripleee

Verwandte Themen