2017-02-17 27 views
0

Я обычно использую очень просто subprocess.check_output:питон check_output печатает, но не хранит в вар

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

Если я боюсь, что есть что-то в stderr, я использую его так:

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

Но у меня есть проблема с 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 

Почему команда nginx -V ведут себя по-разному (вся печать в stderr)? Как я могу разработать esealy обходной путь с `` subprocess.check_output`?

+0

Это может быть, что процесс специально печатая на терминал он запускается на вместо обычных каналов. – languitar

ответ

0

Способ перенаправления стандартной ошибки на стандартный вывод в оболочке - 2>&1, но вам все же следует избегать использования оболочки здесь.

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

Если у вас есть более поздняя Python, также рассмотреть вопрос о переходе на subprocess.run()

+0

См. Также http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess/36008455#36008455 для общего обсуждения того, почему следует избегать 'shell = True'. – tripleee