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

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

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

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

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

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

0
303 30 Июн 2019 в 18:07

3 ответа

Лучший ответ

Когда вы узнаете, что у вас есть полный вывод процесса? когда процесс заканчивается Поэтому нет необходимости прекращать его вручную. Просто подождите, пока все закончится, и используйте 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()
1
Jean-François Fabre 30 Июн 2019 в 15:36

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

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
Ghassen 30 Июн 2019 в 15:44

Вам нужно будет сказать 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()
0
AKX 30 Июн 2019 в 15:09