Модуль atexit определяет функции для регистрации и отмены регистрации функций очистки. Зарегистрированные таким образом функции автоматически выполняются после обычного завершения интерпретатора.
Модуль atexit запускает эти функции в обратном порядке, в котором они были зарегистрированы. Если вы зарегистрируете A , B и C , во время завершения работы программы они будут выполняться в порядке C , B , A .
Примечание: функции, зарегистрированные через этот модуль, не вызываются, когда программа прерывается сигналом, не обработанным Python, когда обнаружена фатальная внутренняя ошибка Python или когда вызывается os._exit() .
Примеры:
Пример демонстрирует, как модуль может инициализировать счетчик из файла, когда он импортируется и автоматически сохранять обновленное значение счетчика, когда программа завершает работу, не полагаясь на то, что приложение делает явный вызов в этот модуль при завершении.
import atexit try: with open(«counterfile») as infile: _count = int(infile.read()) except FileNotFoundError: _count = 0 def incrcounter(n): global _count _count = _count + n def savecounter(): with open(«counterfile», «w») as outfile: outfile.write(«%d» % _count) import atexit atexit.register(savecounter)
Позиционные и ключевые аргументы также могут быть переданы в atexit.register() для передачи зарегистрированной функции при ее вызове:
Как сделать чтобы консоль Python не закрывалась
def goodbye(name, adjective): print(‘Goodbye, %s, it was %s to meet you.’ % (name, adjective)) import atexit atexit.register(goodbye, ‘Donny’, ‘nice’) # или atexit.register(goodbye, adjective=’nice’, name=’Donny’)
Использование в качестве декоратора.
функция atexit.register() в качестве декоратора работает только с функциями, которые можно вызывать без аргументов.
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Функция register() модуля atexit.
- Функция unregister() модуля atexit.
Источник: docs-python.ru
Действия перед закрытием скрипта python
Привет у меня есть скрипт на python, который запускает в бесконечном цикле некоторые действия, но иногда мне приходится закрывать скрипт и обновлять его новой версией, делать некоторые работы на сервере и т. д.
вопрос в том, как я могу остановить скрипт и, прежде чем закрыть его, скрипт делает некоторые действия после цикла Как закрыть соединение sqlite, закрыть соединение с брокером и т. д.
то, что я делаю сейчас, это ctr+c, пока он не остановится (несколько раз до его завершения), а затем вручную закройте соединение sqlite и т. д.
4 ответов
Вы можете поймать сигнал, выполнить что-то другое, то sys.exit
import signal import sys def signal_handler(signal, frame): print ‘You pressed Ctrl+C — or killed me with -2’ #. Put your logic here . sys.exit(0) signal.signal(signal.SIGINT, signal_handler)
можно использовать atexit модуль:
Python в .EXE ► КАК?
import atexit def cleanup(): print «cleanup» # close connections, . atexit.register(cleanup)
на cleanup() функция будет вызываться при каждом обычном завершении (включая Ctrl-C).
автор: TobiMarg
вы могли бы использовать try-except блок вокруг вашего цикла и поймать KeyboardInterrupt исключения. Или finally блок также очистить, если программа завершается упорядоченным образом. Ваш код должен выглядеть примерно так:
try: except KeyboardInterrupt: finally:
обратите внимание, что таким образом вы обрабатываете только случай, когда вы убиваете свой скрипт с помощью прерывания клавиатуры и никакого другого случая.
вы также можете использовать with сообщении см. здесь для получения дополнительной информации (как указано в комментарии)
автор: wastl
import sys try: # Program here except KeyboardInterrupt: # Close connections sys.exit(0)
Источник: askdev.ru
Почему в python при нажатии на «Отмена» при открытии нескольких файлов программа вылетает?
Добрый день! Не подскажите почему в python при нажатии на «Отмена» при открытии нескольких файлов методом QFileDialog.getOpenFileNames программа вылетает? Код:
import sys import codecs from vira import * from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import (QDialog, QFileDialog, QMessageBox, QLineEdit, QProgressBar, QProgressDialog) from PyQt5.QtCore import QDir, QDirIterator class MyWin (QtWidgets.QMainWindow): def __init__(self, parent=None): QtWidgets.QWidget.__init__ (self, parent) self.ui = Ui_MainWindow () self.ui.setupUi (self) self.ui.pushButton.clicked.connect (self.Open) self.ui.pushButton_2.clicked.connect (self.close) def Open(self): self.ui.textEdit.clear () files, _ = QFileDialog.getOpenFileNames (self, «Выбрать файлы», «/home», «*.txt») hjh = list (filter (lambda x: x != ‘*.las *.txt’, files)) myString = ‘n’.join (hjh) self.ui.textEdit.setText (myString) if self.ui.comboBox.currentIndex () == 0: strx = self.ui.textEdit.toPlainText () strxList = strx.split (‘n’) else: strx = self.ui.textEdit.toPlainText () strxList = strx.split (‘n’) for jk in range (0, len (strxList), 1): print (strxList[jk]) f = codecs.open (strxList[jk], ‘r’, encoding=’cp866′) for line in f: pkp = 1 for lk in range (0, len(line), 1): if line[lk] == ‘0’ or line[lk] == ‘1’ or line[lk] == ‘2’ or line[lk] == ‘3’ or line[lk] == ‘4’ or line[lk] == ‘5’ or line[lk] == ‘6’ or line[lk] == ‘7’ or line[lk] == ‘8’ or line[lk] == ‘9’ or line[lk] == ‘.’ or line[lk] == ‘,’ or line[lk] == ‘-‘ or line[lk] == ‘n’ or line[lk] == ‘ ‘ or line[lk] == ‘ ‘:#or line[lk:(lk+2)] != ‘—‘ or line[lk] != ‘#’: pkp += 1 if pkp == len(line): print(line[0:len(line)-1]) self.ui.textEdit.append(line[0:len(line)-2]) f.close() if __name__ == «__main__»: app = QtWidgets.QApplication (sys.argv) myapp = MyWin () myapp.show () sys.exit (app.exec_ ())

Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Подписка на обсуждение 2
Источник: evileg.com