Как предотвратить остановку скрипта пользователем с помощью CTRL + Z? - PullRequest
1 голос
/ 07 февраля 2012

Я хочу запретить пользователю возвращаться в shell_prompt, нажав CTRL + Z в моем скрипте интерпретатора командной строки python.

Ответы [ 4 ]

7 голосов
/ 07 февраля 2012

Вы можете написать обработчик сигнала для SIGTSTP, который запускается с помощью Ctrl + Z . Вот пример:

import signal

def handler(signum, frame):
    print 'Ctrl+Z pressed, but ignored'

signal.signal(signal.SIGTSTP, handler)

while True:
   pass 
3 голосов
/ 07 февраля 2012

Грубо говоря, Ctrl + Z с терминала Unix / Linux в готовом или каноническом режимах приведет к тому, что драйвер терминала сгенерирует сигнал "приостановить" для приложения переднего плана.

Итак, у вас есть два разных подхода. Измените настройки терминала или проигнорируйте сигнал.

Если вы переведете терминал в «сырой» режим, вы отключите генерацию этого сигнала. Также можно использовать настройки терминала (import tty и прочитать информацию о tcsetattr, но также прочитать справочные страницы для `` stty` и terminfo (5) для получения более подробной информации).

ZelluX уже описал самый простой подход к обработке сигналов.

2 голосов
/ 07 февраля 2012

Следующее помогает мне с Linux:

signal.signal(signal.SIGTSTP, signal.SIG_IGN)

Вот полный пример:

import signal

signal.signal(signal.SIGTSTP, signal.SIG_IGN)

for i in xrange(10):
  print raw_input()

Установка моего собственного обработчика сигналов, как предлагает @ZelluX, здесь не работает: нажатие Ctrl + Z в режиме raw_input() дает ложное EOFError:

aix@aix:~$ python test.py
^ZCtrl+Z pressed, but ignored
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    raw_input()
EOFError
1 голос
/ 07 февраля 2012

Даже если вы перехватываете Ctrl + Z (это зависит от настроек вашего терминала - см. Stty (1)), тогда есть другие способы, которыми пользователь может вернуться в командную строку , Единственный «реальный» способ предотвращения возврата в оболочку - удалить процесс оболочки с помощью exec. Итак, в файле запуска пользователя (.profile|.bash_profile|.cshrc) выполните:

exec python myscript.py

Убирайся!

...