配置Python解释器,以便在一个命令失败时停止执行命令列表
我有时会粘贴一个要在Python解释器(())中执行的命令列表。默认情况下,如果一个命令失败(即引发错误),Python解释器将指示该命令失败,然后执行后续命令 有没有办法配置Python解释器(交互模式),以便在一个命令失败时停止执行命令列表配置Python解释器,以便在一个命令失败时停止执行命令列表,python,Python,我有时会粘贴一个要在Python解释器(())中执行的命令列表。默认情况下,如果一个命令失败(即引发错误),Python解释器将指示该命令失败,然后执行后续命令 有没有办法配置Python解释器(交互模式),以便在一个命令失败时停止执行命令列表 答复评论: 我对Linux、Mac OS X和Microsoft Windows感兴趣 我粘贴在Python解释器中的代码示例: 1/0 print('yo') >>> x = [1] >>> y = [1 fo
答复评论:
- 我对Linux、Mac OS X和Microsoft Windows感兴趣
- 我粘贴在Python解释器中的代码示例:
1/0 print('yo')
我不想打印>>> x = [1] >>> y = [1 for _ in range(100)]] File "<stdin>", line 1 y = [1 for _ in range(100)]] ^ SyntaxError: invalid syntax >>> z = x + y Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'y' is not defined
,因为yo
会引发错误1/0
- 我将命令列表从剪贴板粘贴到Python解释器
x = [1]
y = [1 for _ in range(100)]] # <------ SyntaxError
z = x + y
现在点击回车键:
File "<ipython-input-136-20c7b020310a>", line 2
y = [1 for _ in range(100)]]
^
SyntaxError: invalid syntax
文件“”,第2行
y=[1表示范围(100)]]
^
SyntaxError:无效语法
相反,在标准REPL解释器上:
1/0
print('yo')
>>> x = [1]
>>> y = [1 for _ in range(100)]]
File "<stdin>", line 1
y = [1 for _ in range(100)]]
^
SyntaxError: invalid syntax
>>> z = x + y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
>x=[1]
>>>y=[1表示范围(100)]]
文件“”,第1行
y=[1表示范围(100)]]
^
SyntaxError:无效语法
>>>z=x+y
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“y”
您可以扩展并创建自己的shell,在出现错误时自动释放。您甚至可以在交互模式下运行它:)
下面是一个小例子:
from code import InteractiveConsole
import sys
class Shell(InteractiveConsole):
def __init__(self):
self.stdout = sys.stdout
InteractiveConsole.__init__(self)
return
def runcode(self, code):
try:
exec code in self.locals
except:
self.showtraceback()
sys.exit(1) # <-- this is the secret sauce!
if __name__ == '__main__':
sh = Shell()
sh.interact()
从代码导入InteractiveConsole
导入系统
类Shell(InteractiveConsole):
定义初始化(自):
self.stdout=sys.stdout
InteractiveConsole.\uuuuu初始化\uuuuuuuu(自)
回来
def运行代码(自身,代码):
尝试:
self.locals中的exec代码
除:
self.showtraceback()
sys.exit(1)#>>sh=Shell()
>>>sh.interact()
Python 2.7.6(默认,2016年1月26日,22:37:40)
[GCC 4.2.1达尔文兼容苹果LLVM 7.0.2(clang-700.1.81)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
(壳牌)
>>> 1
1.
>>> 1+1
2.
>>> 1/0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ZeroDivisionError:整数除法或模零除法
阿尔法西:~/桌面>
大量借用@alfasin的答案,您可以扩展InteractiveConsole
类
要保持交互式会话运行,但忽略其余粘贴的命令,可以在异常发生后丢弃输入一段时间(我用了1秒)。这意味着其余粘贴的命令将被忽略,而会话仍在运行
from code import InteractiveConsole
import sys
import time
WAIT_TIME = 1
class Shell(InteractiveConsole):
def __init__(self):
self.stdout = sys.stdout
InteractiveConsole.__init__(self)
return
def runcode(self, code):
try:
exec(code, self.locals)
except SystemExit:
raise
except:
self.showtraceback()
t_end = time.time() + WAIT_TIME
while time.time() < t_end:
_ = self.raw_input() # Extra pasted commands are discarded
if __name__ == '__main__':
sh = Shell()
sh.interact()
从代码导入InteractiveConsole
导入系统
导入时间
等待时间=1
类Shell(InteractiveConsole):
定义初始化(自):
self.stdout=sys.stdout
InteractiveConsole.\uuuuu初始化\uuuuuuuu(自)
回来
def运行代码(自身,代码):
尝试:
exec(代码,self.locals)
除系统退出外:
提升
除:
self.showtraceback()
t_end=time.time()+等待时间
当time.time()结束时:
_=self.raw_input()#多余的粘贴命令将被丢弃
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
sh=Shell()
sh.interact()
请注意,额外的命令仍然打印到终端,但实际上没有运行。“Python解释器中要执行的命令列表”-如何执行?哪个操作系统?您能提供一个例子吗?@alfasin问题更新。如果我的问题不清楚,很抱歉:您如何运行这些“命令列表”?如果您将这些命令列表保存在file.py中,并用“python file.py”调用它,则最后要执行的命令将是1/0-在您的示例中。@alfasin我从剪贴簿粘贴命令列表。我假设您指的是“交互模式”?回答得不错!但这并不能保持交互式会话的运行,我认为这是本文的目的。我希望您不要介意我从您的答案中借用了大量内容,试图保持交互式会话的运行,但忽略后续粘贴的命令。:)让我知道你是否喜欢编辑答案。@AndrewGuy我认为他不想保留交互式会话-问题是关于第一个错误的回避。保留会话是OP想要摆脱的默认行为。你可能是对的。希望OP能加入进来。我认为他的意思是希望保持会话打开,但忽略粘贴的其余命令。但重读后似乎不那么清楚。