подпроцесс python скрыть стандартный вывод и дождаться его завершения - PullRequest
5 голосов
/ 27 июня 2010

У меня есть этот код:

def method_a(self):
    command_line = 'somtoolbox GrowingSOM ' + som_prop_path
    subprocess.Popen(shlex.split(command_line))
    ......

def method_b(self): .....
....

и, как вы все видите, у method_a есть подпроцесс, вызывающий программу somtoolbox.Но у этой программы длинный вывод, и я хочу это скрыть.Я попытался:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE)

Но он вернул это предложение:

cat: record error: Broked Pipe   

(это перевод португальского предложения: "cat: erro de gravação: Pipe quebrado")я из Бразилии)

Также у меня есть другие методы (например, method_b там), которые вызываются после method_a, и эти методы выполняются до того, как подпроцесс завершит процесс.

Как яможет вообще скрыть стандартный вывод (и нигде не хотеть его) и заставить другой код ждать, пока подпроцесс завершит выполнение?

Obs: somtoolbox - это java-программа, которая выдает длинный выводв терминал.Пробовал:

outputTuple = subprocess.Popen(shlex.split(command_line), stdout = subprocess.PIPE).communicate()

но непрерывно возвращал вывод в оболочку.Помогите!

Ответы [ 2 ]

18 голосов
/ 27 июня 2010

Лучший способ сделать это - перенаправить вывод в / dev / null.Вы можете сделать это следующим образом:

devnull = open('/dev/null', 'w')
subprocess.Popen(shlex.split(command_line), stdout=devnull)

Затем, чтобы подождать, пока это не будет сделано, вы можете использовать .wait () для объекта Popen, чтобы получить следующее:

devnull = open('/dev/null', 'w')
process = subprocess.Popen(shlex.split(command_line), stdout=devnull)
retcode = process.wait()

retcodeбудет содержать код возврата процесса.

ДОПОЛНИТЕЛЬНО: Как уже упоминалось в комментариях, это не скроет stderr.Чтобы скрыть stderr, вы должны сделать это так:

devnull = open('/dev/null', 'w')
process = subprocess.Popen(shlex.split(command_line), stdout=devnull, stderr=devnull)
retcode = process.wait()
5 голосов
/ 27 июня 2010

Popen.communicate используется для ожидания завершения процесса.Например:

from subprocess import PIPE, Popen
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate()

вернет кортеж строк, один для stdout, а другой для вывода stderr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...