2016-04-27 2 views
0

Как я могу предотвратить закрытие окна оболочки/командной строки/терминала Python, если пользователь нажимает кнопку закрытия окна? Я попытался поймать SystemExit исключения и переопределить sys.exit(), без успеха.Запретить закрытие оболочки Python

Я знаю, я могу сделать это с помощью инструментария GUI/рамки, такого как PyQt, но импорт этого (и в том числе в финальной бинарной части моей программы) не будет вариантом, пока он слишком большой.

+0

какую ОС вы планируете использовать? –

+0

@Ashafix Windows в то время, не-платформенное независимое решение было бы в порядке – linusg

ответ

2

Это не возможно сделать в общем случае.

Терминальное окно (вообще говоря) представляет собой отдельный процесс из самого Python (YMMV с IPython и другие подобные вещи, но это верно, если вы используете обычный Python внутри обычного терминала). Когда оконечное окно решает уйти, невозможно (в большинстве разумных операционных систем и оконных менеджеров) предотвратить это, потому что это совершенно другая программа, которая просто выводит ваш вход и выход.

Вы можете, однако, ваша программа работает после закрытия терминала. Терминал все равно уйдет, но программа будет работать в фоновом режиме. В системах Unix это обычно делается путем улавливания или игнорирования сигнала SIGHUP с использованием signal.

В зависимости от вашей операционной системы и выбора эмулятора терминала может быть или не быть возможно настроить терминал на то, чтобы он не закрывался. Некоторые эмуляторы терминала под Linux, по умолчанию, предупреждают пользователя о том, что есть процесс, запущенный под терминалом, когда пользователь пытается его закрыть. Это сильно зависит от платформы и не может быть сконфигурировано (возможно, переносимо или возможно вообще) изнутри Python.

+0

Спасибо за это, я подумал вот так. Но как PyQt предотвращает закрытие окна? Должно быть любое решение ... – linusg

+0

@linusg: В PyQt окно принадлежит процессу Python, поэтому он может контролировать, что происходит, когда пользователь нажимает кнопку закрытия. Если вы работаете под терминалом, вы не являетесь владельцем или не управляете окном, поэтому вы не можете остановить его. Конечно, если пользователь решает завершить процесс через диспетчер задач или эквивалент вашей системы, вы можете сделать это независимо от проблем с GUI-vs-terminal. – Kevin

+0

ОК, я должен жить с этим. Любой другой способ завершить цикл while перед закрытием? – linusg

Смежные вопросы