Я пытаюсь завершить программу Python, которая сама использует множество потоков.
Если я не ошибаюсь, просто sys.exit() работает нормально .
Однако, чтобы избежать многочисленных ошибок, в том числе потери ссылок на темы, я попробовал следующее:
subprocess.Popen(['start', 'cmd.exe', '/c', f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Я подумал, что проблема в экранировании кавычек, поэтому попробовал несколько вещей, но безуспешно. Я сдался и сделал следующее, и все сработало отлично.
with open('exit_self.bat', 'w') as file:
file.write(f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"&del exit_self.bat')
subprocess.Popen(['start', 'cmd.exe', '/c', 'exit_self.bat'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Как это сделать без временных файлов? Что я пропустил? Для справки, я использовал /k вместо параметра /c cmd.exe, чтобы выйти из окна и проверить сообщение об ошибке в окне, оно выглядит следующим образом:
Waiting for 0 seconds, press a key to continue ...
ERROR: Invalid argument/option - 'eq'.
Type "TASKKILL /?" for usage.
Не уверен, поможет ли это, но я добавил echo, чтобы увидеть синтаксис выполняемой команды:
subprocess.Popen(['start', 'cmd.exe', '/k', 'echo', f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Результат:
"timeout 5&taskkill /f /fi \"PID eq 3988\""
Подробнее здесь: https://stackoverflow.com/questions/790 ... or-windows