подпроцесс Python скрывает stdout и ожидает он для завершения

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

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

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

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

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

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

cat: record error: Broked Pipe   

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

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

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

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

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

но непрерывный вывод возврата к оболочке.На помощь!

5
задан Gabriel L. Oliveira 26 June 2010 в 22:00
поделиться

2 ответа

Лучший способ сделать это - перенаправить вывод в / 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()
18
ответ дан 18 December 2019 в 06:49
поделиться

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

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

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

5
ответ дан 18 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: