- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
今天,当我发现有些奇怪的东西时,我不得不检查我的脚本如何在Windows命令提示符[1]上运行。我正在从事与此类似的工作,但这足以证明问题所在。这是代码。
def bing():
try:
raw_input()
except KeyboardInterrupt:
print 'This is what actually happened here!'
try: # pardon me for those weird strings
bing() # as it's consistent with everything in the chat room (see below)
print 'Yoo hoo...'
except KeyboardInterrupt:
print 'Nothing happens here too!'
这是情况。当脚本运行时,它将等待输入,并且用户应按Ctrl + C组合键以生成
KeyboardInterrupt
,该
except
将(应该)被
bing()
中的
KeyboardInterrupt
块捕获。因此,这应该是实际输出。而且,这就是我在Ubuntu终端和IDLE(在Windows和Ubuntu上)上运行它时发生的情况。
This is what actually happened here!
Yoo hoo...
但是,这并没有在Windows命令提示符下按预期进行。我宁愿得到一个奇怪的输出。
This is what actually happened here! Nothing happens here too!
看起来像一个
signal.signal
在整个程序中传播并最终终止了它。
SIGINT
来处理
Exception
(这不起作用),然后使用处理函数来产生一个
try... catch
,稍后再捕获(这也不起作用),然后事情变得比它曾经是。因此,我回到了原来的
EOFError
。然后,我去了Python专家室。
EOFError
。然后,在按Ctrl + Z并按Enter时,
@ZeroPiraeus said会升起。
EOFError
和
KeyboardInterrupt
来解决。虽然每次按Ctrl + Z和Enter感到很懒,但这对我来说不是一个大问题。但是,这对我来说是一种困扰。
KeyboardInterrupt
出现。
KeyboardInterrupt
传播?有没有办法使输出与终端一致?
最佳答案
链接user2357112的问题以某种方式对此进行了解释:Why can't I handle a KeyboardInterrupt in python?。
键盘中断是异步引发的,因此它不会立即终止应用程序。取而代之的是,Ctrl + C在某种事件循环中进行处理,该过程需要一段时间才能到达那里。不幸的是,在这种情况下,您不能可靠地捕获KeyboardInterrupt
。但是我们可以做一些事情来达到目标。
正如我昨天所解释的,停止raw_input
调用的异常不是KeyboardInterrupt
而是EOFError
。您可以通过如下更改bing
函数轻松地验证这一点:
def bing():
try:
raw_input()
except Exception as e:
print(type(e))
EOFError
而不是
KeyboardInterrupt
。您还将看到
print
甚至没有完全通过:没有新行。这显然是因为输出被print语句将异常类型写入stdout之后立即到达的中断所中断。当您向打印物中添加更多内容时,也可以看到以下内容:
def bing():
try:
raw_input()
except EOFError as e:
print 'Exception raised:', 'EOF Error'
except
将触发,并捕获键盘中断。
def bing():
try:
input()
except Exception as e:
print('Exception raised:', type(e))
try:
bing()
print('After bing')
except KeyboardInterrupt:
print('Final KeyboardInterrupt')
Exception raised: <class 'EOFError'>
After bing
Final KeyboardInterrupt
bing()
之后的打印也被执行了。更糟糕的是,在使用cmd.exe的某些执行中,我得到的结果是根本没有捕获到键盘中断(显然,该中断在程序已经完成之后得到了处理)。
input()
(或
raw_input()
)提示总是会产生
EOFError
:这是我们一直以来所见的一致现象。因此,我们所能做的就是捕捉到该错误,然后确保获得键盘中断。
KeyboardInterrupt
的异常处理程序中引发
EOFError
。但这不仅让人感到肮脏,而且还不能保证实际上中断实际上是终止输入提示的原因(谁知道还有什么可能引发EOFError?)。所以我们应该让已经存在的中断信号产生异常。
import time
def bing():
try:
input() # or raw_input() for Python 2
except EOFError:
time.sleep(1)
try:
bing()
print('After bing')
except KeyboardInterrupt:
print('Final KeyboardInterrupt')
KeyboardInterrupt
,并且除了我在异常处理程序中所做的操作之外,将不会打印其他任何内容。
time.sleep
之后仅几毫秒的时间,捕获了中断,我们就在异常处理程序中。因此,一秒钟只是故障保护,它将等待足够长的时间,以确保异常能够及时到达。在最坏的情况下,当实际上没有中断而只有“正常” EOFError时?然后,以前无限阻塞以供用户输入的程序将花费一秒钟更长的时间才能继续;从来都不是真正的问题(更不用说EOFError可能非常罕见)。
关于python - 无法在命令提示符下两次捕获KeyboardInterrupt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31127652/
有什么方法可以自定义javascript提示框吗? 我想让我的提示只接受数字输入...(我想绑定(bind) keyup 事件 - 具体来说) 这可能吗? 最佳答案 默认的 javascript 提示
对我来说,现在是 bash-prompt-fiddling-time(总有一天……)。 我正在尝试获取两行提示: 第一行包含位置信息,背景颜色到行尾 第 2 行包含时间和上一个命令的退出代码 我快到了
大家好,我只是在学习 javascript,不过我有一些 html 和 css 背景。 我不知道如何只允许在提示中输入数字值,或者检查它是否是数字,如果不是则重新提示。文本框也是如此。 最佳答案 这是
编辑:原标题说“bash prompt”,但我使用“zsh”。我接受了@Artur R. Czechowski 的回答,因为它在 bash 上下文中是正确的,并且我能够在他的帮助下完成我的工作。 PR
是否可以配置stack ghci类似于ghci的方式通过 ~/.ghci 配置文件? 目前stack ghci不接受 ~/.ghci 中的设置文件。 我正在研究将提示设置为 lambda 而不是加载的
我喜欢在我的 PowerShell 提示符中包含 Mercurial/Git 存储库状态。有时这会减慢 prompt()功能相当大,导致长时间等待,直到您可以开始在 shell 中输入。我想知道,是否
我正在编写一个用于与远程服务交互的 PowerShell 模块。连接到远程服务时(通过模块中的函数),我想在提示符前添加用户名。断开连接后,我想删除用户名。 我以为我可以通过复制全局 prompt 来
我用java开发了我的远程屏幕共享软件。它工作正常,但是当使用 UAC 时,屏幕上会出现允许/禁止提示,但远程屏幕看不到它。所以每次用户都必须手动允许它。我想知道如何摆脱这个问题。 最佳答案 这正是
我有一个初始化脚本,它设置了几个变量供以后使用。最后一行定义了一个“提示”函数,我希望它能改变我的提示,作为初始化已经完成的指示。变量已设置,因此它不作为子进程运行,但我的提示顽固地停留在“PS”。出
我有一个与此类似的模板提示: prompt = f""" Write a poem about the topic delimited by triple backticks if it starts
我有一个与此类似的模板提示: prompt = f""" Write a poem about the topic delimited by triple backticks if it starts
我需要一些帮助才能恢复提示,现在我正在执行此 block ,不要让我恢复提示,我在运行末尾使用 &将此命令作为后台任务。执行脚本后如何返回提示符。 #!/bin/sh sudo su - user <
如果我的 html 中有一个简单的按钮: Start Game 我想要在我的 JS 中提示: var userAdjective = prompt("Please provide an Adjecti
我想提示用户在网页上进行一些输入。 我无法使用内置的 Javascript prompt 函数,因为它会在 IE 中创建安全警告。 是否有人们用来重新创建此内容的最佳实践/方法/示例? Javascr
我想将我的 bash 提示设置为固定宽度,并弥补 $ 之前的空格差异,因此无论长短,我的提示都保持相同的宽度: [name@host] ~/Directory/Dir...Another/LastDi
我有一个脚本可以读取用户的输入。这是我的代码: if [ -z $volreadexists ]; then echo -e "\tThis will overwrite the en
我的 ZSH 主题使用 .zsh-theme 文件中的 RPROMPT='$(vbox_status)' 输出我的 Vagrant/VBox VM 的状态(其中 vbox_status调用 a scr
我经常使用 vim,并且经常发现使用 !bash 进入命令行很有用。但是,我需要键入 exit 才能返回到 vim,有时我不确定我是否在子 shell 中或者这是否会关闭我的 session 。 我真
问题很简单。我想在我的 bash 脚本中评估 PS1 的当前值。 Google 上的所有资料都指向有关如何改进它的教程,但我想评估一下我当前的终端或至少 一些 终端将如何呈现它。 是否有任何软件/功能
如何在打印后台函数的输出后自动返回到我的 bash 提示符? 例如,当我在 bash shell 中运行以下脚本时: fn(){ sleep 10 echo "Done"
我是一名优秀的程序员,十分优秀!