【问题标题】:How to prevent user stopping script by CTRL + Z?如何防止用户通过 CTRL + Z 停止脚本?
【发布时间】:2012-02-07 10:42:39
【问题描述】:

我想通过在我的 python 命令行解释器脚本中按 CTRL + Z 来防止用户返回到 shell 提示符。我该怎么做?

【问题讨论】:

  • 您可能以错误的方式调用脚本。如果直接在新终端中打开,Ctrl+Z 不会做任何事情;但是,我不知道你想要达到什么目的。不过,在尝试阻止 Ctrl+Z 之前请三思。

标签: python background signals command-line-interface


【解决方案1】:

您可以为 SIGTSTP 编写一个信号处理程序,由 Ctrl + Z 触发。这是一个例子:

import signal

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

signal.signal(signal.SIGTSTP, handler)

while True:
   pass 

【讨论】:

  • 如果将pass 替换为raw_input(),在我的机器上会中断:当我按下Ctrl-Z 时,我得到一个虚假的EOFError
  • @aix 你一定是按了 Ctrl+D。
  • @Chewie:然后我们的设置有些不同。作为参考,我在下面的答案中添加了例外。
  • @aix 它至少适用于 Python >= 2.7.2,但我在使用 Python 2.6 测试时得到了你的场景。
  • @Chewie:在这里,我使用 Python 2.7.1。可能与二进制文件的构建方式有关,而不是解释器的版本。
【解决方案2】:

在我的 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 的建议安装我自己的信号处理程序在这里不起作用:在raw_input() 中按 Ctrl+Z 会得到一个虚假的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

【讨论】:

    【解决方案3】:

    粗略地说,来自 Unix/Linux 终端的熟化或规范模式下的 Ctrl+Z 将导致终端驱动程序向前台应用程序生成“挂起”信号.

    所以你有两种不同的整体方法。更改终端设置或忽略信号。

    如果您将终端置于“原始”模式,那么您将禁用该信号生成。也可以使用终端设置(import tty 并阅读有关 tcsetattr 的信息,但也可以阅读 ``stty` 和 terminfo(5) 的手册页了解更多详细信息)。

    ZelluX 已经描述了最简单的信号处理方法。

    【讨论】:

      【解决方案4】:

      即使您捕获 Ctrl+Z(这取决于您的终端设置 - 请参阅 stty(1)),用户也可以通过其他方式返回命令-线。防止返回到 shell 的唯一“真正”方法是使用 exec 删除 shell 进程。所以,在用户的启动文件(.profile|.bash_profile|.cshrc)中:

      exec python myscript.py
      

      摆脱它!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-02
        相关资源
        最近更新 更多