Как получить вывод подпроцесса Python и завершить его впоследствии? - PullRequest
0 голосов
/ 30 июня 2019

Я хочу получить вывод моего подпроцесса. Поскольку он работает бесконечно, я хочу прекратить его, когда выполняются определенные условия.

Когда я запускаю подпроцесс с помощью check_output, я получаю вывод, но не могу обработать прерывание процесса:

output = subprocess.check_output(cmd, shell=True)

Когда я запускаю подпроцесс с помощью Popen или run, я получаю дескриптор для завершения процесса, но без вывода.

p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)

Как я могу получить оба?

Ответы [ 3 ]

1 голос
/ 30 июня 2019

когда вы узнаете, что у вас есть полный вывод процесса?когда процесс заканчиваетсяПоэтому нет необходимости прекращать его вручную.Просто подождите, пока он не закончится, и используйте check_output.

Теперь, если вы хотите дождаться появления данного паттерна, , затем завершите, теперь это что-то другое.Просто читайте построчно, и если какой-то шаблон соответствует, прервите цикл и завершите процесс

p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid) # add stderr=subprocess.PIPE) to merge output & error
for line in p.stdout:
   if b"some string" in line:  # output is binary
       break
p.kill() # or p.terminate()
0 голосов
/ 30 июня 2019

попробуйте это:

import subprocess
p = subprocess.Popen("ls -a", shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print((p.stdout.read()))
if p.stdout.read() or p.stderr.read():
    p.terminate()
0 голосов
/ 30 июня 2019

Вам нужно будет сказать Popen, что вы хотите прочитать стандартный вывод, но это может быть немного сложно.

p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid, stdout=subprocess.PIPE)
while True:
    chunk = p.stdout.read(1024)  # this will hang forever if there's nothing to read
p.terminate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...