Завершить подпроцесс, если строка находится в выводе - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь завершить pid подпроцесса, если в выводе есть строка, но она не работает.Что случилось?

import subprocess
import shlex


if "PING" in subprocess.check_call(shlex.split("ping -c 10 gogole.com")):
    subprocess.check_call(shlex.split("ping -c 10 gogole.com")).terminate()

Ответы [ 2 ]

0 голосов
/ 12 октября 2018
import subprocess, os
run = "ping -c 10 google.com"
log = ""
process = subprocess.Popen(run, stdout=subprocess.PIPE, shell=True)
while True:
    out = process.stdout.read(1)
    log +=out
    print log
    if out == '' and process.poll() != None:
        break
    if "PING" in log:
        print "terminated!"
        process.kill()
        process.terminate()
        break
0 голосов
/ 09 октября 2018

Пожалуйста, обратитесь к документации для методов, которые вы вызываете.Прежде всего, check_call выполняется до завершения процесса, затем возвращает код возврата из процесса.Я не уверен, как вы намереваетесь найти "PING" из кода возврата, который обычно является целым числом.

Если это там , посмотрите на тело вашего ifУтверждение: вы создаете совершенно новый экземпляр ping, ждете его завершения и затем пытаетесь завершить код возврата.

Я рекомендую вам изучить руководство по подпроцессам.Узнайте, как захватить дескриптор процесса и вызвать операции на , которые .Вам нужно получить дескриптор выходного потока, найти «PING» в , что , а затем вызвать terminate в дескрипторе процесса, который вы получили при вызове.

...