У меня есть графический интерфейс Tk с кнопками запуска и отмены.
Кнопка запуска запускает поток, который порождает подпроцесс и ожидает ответа, чтобы обновить графический интерфейс. >
Кнопка отмены уничтожает порожденный подпроцесс.
Поток зависает, когда я пытаюсь присоединиться. Я не уверен, почему вызов соединения ожидает бесконечно, поскольку подпроцесс завершается и его значение выхода доступно.
Документация по адресу (https://docs.python.org/3/ библиотека/subprocess.html#subprocess.Popen.wait) не очень хороша — я знаю, что там написано «ожидает завершения процесса», но сценарий использует утилиту, которая, кажется, улавливает и игнорирует это, поэтому мне нужно использовать kill. Я знаю, что следующий код упрощен, но я убиваю все дочерние процессы порожденного сценария.
Если кто-нибудь знает, что я сделал неправильно или что я не делаю, пожалуйста, дайте мне знать
class MyGUIClass
def __init__(self):
self.my_worker = MyWorkerClass()
def on_start_button():
self.worker_thread=Thread(target=self.start_process)
self.worker_thread.start()
def start_process(self):
result = self.my_worker.run_script()
self.update_gui(result) # Only gets here if not cancelled
def on_cancel_button():
self.my_worker.stop_script()
self.worker_thread.join() # Seems to hang here
print('Never happens')
def update_gui(self, result):
# do something pretty
class MyWorkerClass
def run_script(self):
self.script_proc = subprocess.Popen(['script-to-be-run.bat'])
self.script_proc.wait()
return(self.script_proc.returncode == 0)
def stop_script(self):
self.script_proc.kill()
print(f'PID {self.script_proc.pid} returned {self.script_proc.returncode}')
Подробнее здесь: https://stackoverflow.com/questions/792 ... for-script
Python Thread.join никогда не происходит после убийства подпроцесса сценария ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение