配置Python解释器,以便在一个命令失败时停止执行命令列表

配置Python解释器,以便在一个命令失败时停止执行命令列表,python,Python,我有时会粘贴一个要在Python解释器(())中执行的命令列表。默认情况下,如果一个命令失败(即引发错误),Python解释器将指示该命令失败,然后执行后续命令 有没有办法配置Python解释器(交互模式),以便在一个命令失败时停止执行命令列表 答复评论: 我对Linux、Mac OS X和Microsoft Windows感兴趣 我粘贴在Python解释器中的代码示例: 1/0 print('yo') >>> x = [1] >>> y = [1 fo

我有时会粘贴一个要在Python解释器(())中执行的命令列表。默认情况下,如果一个命令失败(即引发错误),Python解释器将指示该命令失败,然后执行后续命令

有没有办法配置Python解释器(交互模式),以便在一个命令失败时停止执行命令列表


答复评论:

  • 我对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解释器


我不确定如何在标准Python REPL上修复此问题,但使用IPython肯定可以实现这一点

在IPython中,粘贴代码时,它被视为单个代码块,而不是一组单独的语句

例如,在终端上打开IPython交互式会话并粘贴以下内容:

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能加入进来。我认为他的意思是希望保持会话打开,但忽略粘贴的其余命令。但重读后似乎不那么清楚。