У меня проблема с уничтожением подпроцессов. Следующий фрагмент кода используется для создания подпроцесса -
while(not myQueue.empty()):
p=Popen(myQueue.get(),shell=True,stdin=PIPE,stderr=PIPE)
Я создаю процессы путем итерации, пока очередь (в которой есть команды) не станет пустой. Переменная p является глобальной и является объектом типа Popen. Несмотря на то, что команда сделала то, что должна, у меня возникли проблемы с кнопкой остановки, которая не останавливает процесс, как я ожидал.
Код кнопки останова следующий:
stop=Button(textBoxFrame,text="Stop",width=5,command=stopAll)
stop.grid(row=1,column=4)
Метод stopAll вызывается вышеуказанной кнопкой остановки, которая убивает текущий подпроцесс p.
def stopAll():
p.kill()
ПРИМЕЧАНИЕ. - Нет ошибок, исключений или проблем с компиляцией.
UPDATE:
Проблема в том, что p.kill()
не убивал процесс, который мне нужно было убить. Я проверил это с Unix, используя >> ps aux
. Я также сделал свою программу для вывода стартовых и убивающих PID, чтобы я мог проверить их с помощью ps aux
. Я обнаружил, что процесс, который мне нужно убить, был на расстоянии 6 PID от p.pid
, я попытался убить процесс, например os.kill((p.pid)+6,signal.SIGKILL)
, который работает и остановил правильный процесс. Но я не хочу так поступать, поскольку есть вероятность, что различные дочерние процессы могут быть убиты. Я даю более подробную информацию о моей проблеме-
Очередь, которую я здесь использую, содержит команды, как я уже говорил ранее. Команда примерно такая:
echo "Hello"|festival --tts
Festival - это синтезатор речи в Unix, и festival --tts
получает пользовательский ввод из файла. Я пишу "Hello"
на фестиваль, и он правильно произносит слова. Но p
, который является процессом выполнения вышеупомянутой команды, убивает echo
, а не festival
. Поэтому, пожалуйста, помогите мне с убийством определенного (фестивального) процесса.