Завершение программы в Python
Как сделать раннее завершение программы в Python? В самоучителе я нашёл несколько примеров:
Однако, там не было объяснения какой метод лучше. Какой метод является наиболее "безаварийным"?
И заодно: есть ли в Python понятие Autocloseable объектов? Если я сделаю ранее завершение программы, нужно ли мне будет закрывать файлы и т.д.?
![]()
Короткий ответ:
Лучше использовать sys.exit()
Механизм завершения процесса в Python реализован через бросание исключения SystemExit , таким образом можно просто создать подобное исключение и программа завершится:
Функция exit и аналогичная ей quit созданы для удобства работы в интерактивном режиме и их не рекомендуется использовать внутри скриптов:
They are useful for the interactive interpreter shell and should not be used in programs.
По факту они также просто поднимают исключение, и при попытке вызова без скобок напишут подсказку о правильном способе выхода из интерпретатора:
Использовать sys.exit стоит потому, что эта функция лежит в стандартном модуле и будет всегда там доступна. Также это довольно явный способ выразить своё желание завершить программу.
Есть также дополнительный метод для немедленного завершения программы: os._exit . У него довольно специфическая область применения, и там же есть замечание:
The standard way to exit is sys.exit(n)
Т.е. здесь даётся подтверждение того, что стандартный способ завершения программы — это вызов sys.exit .
Функция os.abort , упомянутая вами, использует механизм сигналов процессу. Конкретно при вызове этой функции будет передан сигнал SIGABRT , что в linux приведёт к завершению программы и созданию дампа памяти процесса. Подобное завершение рассматривается операционной системой как аварийное, поэтому не стоит использовать его для безаварийного завершения приложения.
По второй части вопроса. В Python есть развитая система контекстных менеджеров: классов, которые умеют работать с оператором with . Самое частое использование этого механизма встречается, вероятно, с файлами.
Этот код откроет файл, напечатает его содержимое на экран и закроет файл автоматически, даже если возникнет исключение при его печати.
Для классов, которые не приспособлены для работы с with есть функция closing в библиотеке contextlib . Из документации:
Code like this:
is equivalent to this:
Вот небольшой пример работы этой функции:
Теперь небольшое отступление о том, почему стоит использовать конструкцию with .
Известно, что программа завершится от любого необработанного исключения, а не только от SystemExit . Таким образом, если в вашем коде используются какие-то ресурсы, которые требуется правильным образом закрывать перед завершением работы, нужно оборачивать работу с ними в блоки try . finally . .
Однако, при использовании конструкции with это оборачивание происходит автоматически, и все ресурсы закрываются корректно.
Так как выход из программы — это всего лишь брошенное исключение, то и в случае использования функции sys.exit закрытие открытых в операторе with ресурсов произойдёт корректно:
Вы можете писать также и свои классы, предоставляющие ресурсы или классы, оборачивающие другие, которые нужно уметь закрывать автоматически. Для этого используются методы __enter__ и __exit__ .
Python, как правильно завершить процесс .exe?
Теперь через определённое время их нужно завершить, например третий профиль, потом пятый, первый и т.д
С этим я так и не разобрался.
Разобрался как убить все процессы firefox.exe:
os.system(«taskkill /im firefox.exe»)
Но при следующем запуске, firefox пишет что не корректно была завершена работа и просит запуститься в безопасном режиме.
При alt+f4 не ругается на некорректное завершение работы.
Вопрос в том как правильно завершить что бы он не ругался?
А ещё лучше как правильно завершить определённый профиль?
- Вопрос задан более года назад
- 1180 просмотров
- Вконтакте

- Вконтакте


Это плохая практика. Намного лучше делать так:
Если вы запускаете через интерпретатор пайтона, если же у вас упакованный .py файл, то лучше сделать так:
Функция kill() модуля os в Python.
Вызывает событие аудита os.killpg с аргументами pgid, sig.
Описание:
Функция kill() модуля os посылает сигнал sig процессу pid . Константы для конкретных сигналов, доступных на хост-платформе, определяются в модуле signal .
Функция os.kill() событие аудита os.kill с аргументами pid , sig .
Функция killpg() посылает сигнал sig в группу процессов pgid . Константы для конкретных сигналов, доступных на хост-платформе, определяются в модуле signal .