У меня есть этот код:
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()
но непрерывный вывод возврата к оболочке.На помощь!
Лучший способ сделать это - перенаправить вывод в / 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()
Popen.communicate
используется для ожидания завершения процесса. Например:
from subprocess import PIPE, Popen
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate()
вернет кортеж строк, одну для stdout, а другую для вывода stderr.