Страницы

Поиск по вопросам

среда, 19 июня 2019 г.

Не убивается процесс из python

Здравствуйте! Есть программа, которая создает процесс, который пингует адрес 192.168.1.1 и записывает данные в файл text.txt. А основная программа читает первые 4 строки из файла и выводит их на стандартный поток вывода, после чего "убивает" раннее созданный процесс и сама завершается. Проблема в том, что процесс не убивается. После завершения программы данные все еще записываются в файл text.txt.
from subprocess import * import time
my_file = open('text.txt', 'a') child=Popen(['ping 192.168.1.1'],shell=True,stdout=my_file) s=' ' my_file_2 = open('text.txt', 'r') k = 0 time.sleep(1) while s: k += 1 if k == 5: child.kill() #пытаюсь убить процесс break s=my_file_2.readline() print(s.rstrip()) time.sleep(1) my_file.close() my_file_2.close()


Ответ

Процесс у вас продолжает жить, потому что child в вопросе это shell, а не ping процесс (python запускает оболочку, которая запускает ping команду). child.kill() убивает shell, а ping продолжает жить.
Не используйте shell=True. Если shell=True используется, то необходимо применять методы, которые убьют сразу всю задачу (группу процессов). См. How to terminate a python subprocess launched with shell=True

Чтобы прочитать 4 строки из вывода дочернего процесса и убить его:
#!/usr/bin/env python3 from subprocess import Popen, PIPE
with Popen(['ping', ip], stdout=PIPE, universal_newlines=True) as process: for n, line in enumerate(process.stdout, start=1): print(line, end='') if n == 4: process.terminate() # or use process.kill()
В зависимости от платформы, у ping могут быть параметры командной строки, которые ограничивают общее кол-во запросов (-c) и/или продолжительность работы (-w).
Если по времени хотите чтение остановить, то см. Stop reading process output in Python without hang?

Комментариев нет:

Отправить комментарий