Здравствуйте! Есть программа, которая создает процесс, который пингует адрес 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?
Комментариев нет:
Отправить комментарий