Как остановить выполнение программы в python


Завершение программы в Python

Короткий ответ:Лучше использовать sys.exit()

Механизм завершения процесса в Python реализован через бросание исключения SystemExit, таким образом можно просто создать подобное исключение и программа завершится:

raise SystemExit # или даже передать число -- код ошибки завершения программы raise SystemExit(1)

Функция exit и аналогичная ей quit созданы для удобства работы в интерактивном режиме и их не рекомендуется использовать внутри скриптов:

They are useful for the interactive interpreter shell and should not be used in programs.

По факту они также просто поднимают исключение, и при попытке вызова без скобок напишут подсказку о правильном способе выхода из интерпретатора:

>>> quit Use quit() or Ctrl-D (i.e. EOF) to exit >>> exit Use exit() or Ctrl-D (i.e. EOF) to exit

Использовать sys.exit стоит потому, что эта функция лежит в стандартном модуле и будет всегда там доступна. Также это довольно явный способ выразить своё желание завершить программу.

Есть также дополнительный метод для немедленного завершения программы: os._exit. У него довольно специфическая область применения, и там же есть замечание:

The standard way to exit is sys.exit(n)

Т.е. здесь даётся подтверждение того, что стандартный способ завершения программы — это вызов sys.exit.

Функция os.abort, упомянутая вами, использует механизм сигналов процессу. Конкретно при вызове этой функции будет передан сигнал SIGABRT, что в linux приведёт к завершению программы и созданию дампа памяти процесса. Подобное завершение рассматривается операционной системой как аварийное, поэтому не стоит использовать его для безаварийного завершения приложения.

По второй части вопроса. В Python есть развитая система контекстных менеджеров: классов, которые умеют работать с оператором with. Самое частое использование этого механизма встречается, вероятно, с файлами.

with open('filename') as my_file: print(my_file.read())

Этот код откроет файл, напечатает его содержимое на экран и закроет файл автоматически, даже если возникнет исключение при его печати.

Для классов, которые не приспособлены для работы с with есть функция closing в библиотеке contextlib. Из документации:

Code like this:

with closing(.open()) as f:

is equivalent to this:

f = .open() try: finally: f.close()

Вот небольшой пример работы этой функции:

import contextlib class Closeable: def close(self): print('closed') with contextlib.closing(Closeable()): pass # печатает closed

Теперь небольшое отступление о том, почему стоит использовать конструкцию with.

Известно, что программа завершится от любого необработанного исключения, а не только от SystemExit. Таким образом, если в вашем коде используются какие-то ресурсы, которые требуется правильным образом закрывать перед завершением работы, нужно оборачивать работу с ними в блоки try ... finally ....

Однако, при использовании конструкции with это оборачивание происходит автоматически, и все ресурсы закрываются корректно.

Так как выход из программы — это всего лишь брошенное исключение, то и в случае использования функции sys.exit закрытие открытых в операторе with ресурсов произойдёт корректно:

with contextlib.closing(Closeable()): sys.exit() # напечатает closed

Вы можете писать также и свои классы, предоставляющие ресурсы или классы, оборачивающие другие, которые нужно уметь закрывать автоматически. Для этого используются методы __enter__ и __exit__.

Источники:

python-scripts.com

Как остановить выполнение программы с помощью python?

Я использую программу (в Windows), имя которой я не буду раскрывать, которая может быть открыта из командной строки без прохождения какой-либо проверки подлинности. Я пытаюсь создать некоторую защиту, чтобы другие люди не могли получить доступ к ней таким образом.

Я планирую заменить встроенный двоичный файл для этой программы командным файлом с первой строкой, которая указывает на мою собственную систему аутентификации (реализована в python, скомпилирована в .exe с py2exe), а вторая строка - команде который открывает программу.

Мой первоначальный план состоял в том, чтобы мой script (auth.py) остановил командный файл от выполнения второй строки, если аутентификация завершилась неудачей с чем-то вроде этого:

if not authenticated: print('Authentication failed') sys.exit(1) else: print('Successfully authenticated!')

Я рассчитывал на sys.exit(1), чтобы сделать это, и я не стал тестировать его, пока не закончил разработку script. Теперь я понимаю, что sys.exit только выходит из процесса python.

Мне нужен либо способ остановить пакетный процесс FROM python script, либо способ для пакета определить код выхода из auth.py(1, если не удалось, 0 если он был пройден) и выполнить только одну программу если код выхода 0 оттуда.

Если кто-нибудь может дать мне какие-либо предложения или помощь, я бы очень признателен. Спасибо!

qaru.site

Как остановить выполнение программы с помощью python?

Я использую программу (в Windows), имя которой я не буду раскрывать, которая может быть открыта из командной строки без прохождения какой-либо проверки подлинности. Я пытаюсь создать некоторую систему безопасности, чтобы другие пользователи не обращались к ней так.

Я планирую заменить встроенную двоичную систему для этой программы командным файлом с первой строкой, которая указывает на мою собственную систему аутентификации (реализована в python, скомпилирована в .exe с py2exe), а вторая строка - команды, которая открывает программу.

Мой первоначальный план должен был иметь мой сценарий (auth.py) прекратить пакетный файл из выполнения второй строки, если аутентификация не удалось что-то вроде этого:

if not authenticated: print('Authentication failed') sys.exit(1) else: print('Successfully authenticated!')

Я рассчитывал на sys.exit (1), чтобы сделать это, и я не стал тестировать его, пока не закончил разработку сценария. Теперь я понимаю, что sys.exit только выходит из процесса python.

Мне либо нужен способ остановить пакетный процесс из сценария python, либо способ для пакета определить код выхода из auth.py (1, если не удалось, 0 если он был пройден) и выполнить другую программу, только если код выхода 0 оттуда.

Если бы кто-нибудь мог дать мне какие-либо предложения или помощь, я был бы очень признателен. Спасибо!

python batch-file exit-code1,291

stackoverrun.com

python: Как остановить / прекратить запуск скрипта Python?

Если ваша программа работает на интерактивной консоли, нажатие CTRL+ Cвызовет KeyboardInterruptисключение в главном потоке.

Если ваша программа на Python не перехватит ее, это KeyboardInterruptприведет к выходу Python. Тем не менее, except KeyboardInterrupt:блок или что-то наподобие except:этого не позволит этому механизму фактически остановить выполнение скрипта.

Иногда, если KeyboardInterruptне работает, вы можете отправить SIGBREAKсигнал вместо этого; в Windows CTRL+ Pause/Breakможет обрабатываться интерпретатором без генерации перехватываемого KeyboardInterruptисключения.

Однако эти механизмы в основном работают, только если интерпретатор Python работает и реагирует на события операционной системы. Если интерпретатор Python по какой-то причине не отвечает, наиболее эффективным способом является завершение всего процесса операционной системы, на котором выполняется интерпретатор. Механизм этого зависит от операционной системы.

В среде оболочки в стиле Unix вы можете нажать CTRL+, Zчтобы приостановить любой процесс, который в данный момент контролирует консоль. Как только вы вернете приглашение оболочки, вы сможете использовать jobsсписок приостановленных заданий и убить первое приостановленное задание с помощью kill %1. (Если вы хотите запустить его снова, вы можете продолжить работу на переднем плане, используя fg %1; для получения дополнительной информации прочитайте руководство вашей оболочки по управлению заданиями.)

Кроме того, в Unix или Unix-подобной среде вы можете найти PID процесса Python (идентификатор процесса) и уничтожить его с помощью PID. Используйте что-то вроде ps aux | grep pythonпоиска запущенных процессов Python, а затем используйте kill для отправки SIGTERMсигнала.

Команда killв Unix отправляется SIGTERMпо умолчанию, и программа Python может установить обработчик сигнала для SIGTERMиспользования signalмодуля. Теоретически, любой обработчик сигнала SIGTERMдолжен корректно завершить процесс. Но иногда, если процесс застрял (например, заблокирован в состоянии непрерывного ввода-вывода), SIGTERMсигнал не имеет никакого эффекта, потому что процесс не может даже проснуться, чтобы обработать его.

Для того, чтобы принудительно убить процесс , который не реагирует на сигналы, вы должны послать SIGKILLсигнал, иногда называют , kill -9потому что 9это числовое значение SIGKILLконстанты. Из командной строки вы можете использовать kill -KILL (или kill -9 для краткости), чтобы отправить SIGKILLи немедленно остановить запуск процесса.

В Windows у вас нет системы сигналов процессов Unix, но вы можете принудительно прервать запущенный процесс, используя TerminateProcessфункцию. В интерактивном режиме самый простой способ сделать это - открыть диспетчер задач, найти python.exeпроцесс, соответствующий вашей программе, и нажать кнопку «Завершить процесс». Вы также можете использовать taskkillкоманду для аналогичных целей.

Автор: Daniel Pryden Размещён: 08.11.2018 03:44

issue.life

Как остановить выполнение программы Python в IDLE

У меня есть скрипт python, который использует plt.show() поскольку это последняя инструкция. Когда он запускается, IDLE просто зависает после последней команды. Я получаю изображение, но я не получаю подсказку назад.

В других сценариях я обычно использую ctrl-c для разрыва программы (иногда это не работает сразу), но как мне получить подсказку с помощью plt.show() ? Ctrl-c не работает …

Существуют ли другие способы остановить программу?

Это IDLE на Windows, если это имеет значение.

Я видел эту проблему с IDLE и matplotlib при их использовании в Windows. Я не знаю точной причины, но для меня обычно работал несколько раз. Если это не сработает для вас, вы можете использовать обычный интерпретатор вместо того, чтобы писать свой сюжет непосредственно в файл вместо экрана.

Это один из тех (много) раз, когда IDLE не ведет себя как обычный скрипт Python или сеанс интерпретатора. Из-за этого я обычно избегаю IDLE.

Ctrl + F6 (перезапустить оболочку)

или Shell-> Restart Shell

Когда вы используете plt.show() , подпроцесс python входит в цикл событий инструментария GUI и блокируется до тех пор, пока цикл цикла не завершится. Когда он выйдет, вы получите приглашение обратно.

Если вы используете бэкэнд TkAgg, вам нужно навести указатель мыши на фигуру после нажатия Ctrl + C. Это приведет к остановке цикла событий. (У Tkinter есть свои причуды)

В качестве альтернативы IdleX предлагает поддержку Matplotlib с IDLE с использованием расширения EventLoop.py. Вы можете отображать и взаимодействовать с фигурами без использования plt.show() . Просто не забудьте установить plt.interactive(True) перед генерированием цифр.

У меня была такая же проблема в Canopy Python Editor, и я смог прервать сеанс python с помощью CTRL+. (кнопка «точка»). Надеюсь, что это поможет, или они, вероятно, делают то же самое

  • Ошибка секундомера Python Tkinter
  • Tkinter help viewer
  • Как я могу изменить текст кнопки, от текста до пустого имени с задержкой?
  • Использование клиента python websocket с tkinter
  • Python 3 и tkinter открывают новое окно, нажимая кнопку
  • Как добавить поддержку Tkinter для библиотеки PIL Python
  • Файл urllib.urlretrieve python 3.3
  • Измените OptionMenu на основе того, что выбрано в другом OptionMenu
  • www.rupython.com

    Как я могу остановить выполнение программы с помощью python?

    Я использую программу (в Windows), имя которой я не буду раскрывать, которая может быть открыта из командной строки без прохождения какой-либо проверки подлинности. Я пытаюсь создать некоторую систему безопасности, чтобы другие пользователи не обращались к ней так.

    Я планирую заменить встроенный двоичный файл для этой программы пакетным файлом с первой строкой, которая указывает на мою собственную систему аутентификации (реализована в python, скомпилирована в .exe с py2exe), а вторая строка - команде, которая открывает программа.

    Мой первоначальный план состоял в том, чтобы мой скрипт (auth.py) остановил командный файл от выполнения второй строки, если аутентификация завершилась неудачей с чем-то вроде этого:

    if not authenticated: print('Authentication failed') sys.exit(1) else: print('Successfully authenticated!')

    Я рассчитывал на sys.exit (1), чтобы сделать это, и я не стал тестировать его, пока не закончил разработку скрипта. Теперь я понимаю, что sys.exit только выходит из процесса python.

    Мне либо нужен способ остановить пакетный процесс из сценария python, либо способ для пакета определить код выхода из auth.py (1, если не удалось, 0 если он был пройден) и выполнить другую программу, только если код выхода 0 оттуда.

    Если бы кто-нибудь мог дать мне какие-либо предложения или помощь, я бы очень признателен. Благодаря!

    switch-case.ru


    Смотрите также