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

有什么方法可以配置Python解释器(交互模式),以便每一个命令失败时它就停止执行命令列表?


回答评论:

  • 我对Linux,Mac OS X和Microsoft Windows感兴趣。
  • 我粘贴在Python解释器中的代码示例:

     1/0 print('yo') 

    我不希望您打印yo ,因为1/0会引发错误。

  • 我将剪贴板中的命令列表粘贴到Python解释器中

#1楼 票数:2

您可以扩展InteractiveConsole并创建自己的外壳,以防出错。 您甚至可以在交互模式下运行它:)

这是一个小例子:

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()

OUTPUT

>>> sh = Shell()
>>> sh.interact()
Python 2.7.6 (default, Jan 26 2016, 22:37:40)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(Shell)
>>> 1
1
>>> 1+1
2
>>> 1/0
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
alfasi:~/Desktop >

#2楼 票数:1

我不确定如何在标准Python REPL上解决此问题,但是您绝对可以使用IPython实现此目的。

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

例如,在终端上打开一个IPython交互式会话并将其粘贴:

x = [1]
y = [1 for _ in range(100)]] # <------ SyntaxError
z = x + y

这是粘贴时的样子:

In [136]: x = [1]
     ...: y = [1 for _ in range(100)]]
     ...: z = x + y

现在按回车:

  File "<ipython-input-136-20c7b020310a>", line 2
    y = [1 for _ in range(100)]]
                               ^
SyntaxError: invalid syntax

相反,在标准REPL解释器上:

>>> 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

#3楼 票数:1

从@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()

请注意,额外的命令仍会打印到终端上,但实际上并未运行。

  ask by Franck Dernoncourt translate from so

未解决问题?本站智能推荐:

1回复

解释器指定的文件不是可执行命令

我正在尝试用 python 运行一个烧瓶应用程序。 当我尝试pip install -r requirements.txt 我收到以下错误 有人可以帮我解决这个问题吗?
2回复

Python命令解释器

我有一个python脚本,我想以这种方式从bash脚本运行: 在python脚本中,我有一些不同的方法,因此输入文件包含以下内容: 问题在于,在这两种方法中,它们都有一个input()方法,需要用户输入(无法更改)。 那么,如何在input_file传递参数(某种换行参数),以便将其
1回复

python解释器命令输入

今天偶然地,我发现在python解释器中按esc esc列出了解释器从其开始的目录的内容。 陌生人仍然是,该序列需要执行两次才能使其最初起作用,但之后每次都起作用。 我在任何地方都找不到该功能的文档,我想知道解释器是否还有其他未记录的功能。
1回复

键盘中断不会停止我的解释器

我正在测试一个对数解析器,它执行一个无限循环(故意),每次循环的冷却时间为3秒。 最终,我会将所有数据链接到GUI前端,这样,当用户准备好进行解析时,就可以调用停止循环。 现在的(小)问题是,当我执行CTRL + Z取消进程时,在终端(在OSX中)中测试输出时,我的活动监视器始终将进程显
2回复

python多执行命令

我已经运行了多个与命令相关的命令。 但是我不 错误: 可操作的程序或批处理文件。
1回复

如何编写一个将在python中执行一系列乌龟移动命令的字符串解释器?

我正在一个项目中想要输入诸如“ F100 <30S30”的字符串 F100将乌龟向前移动100,<30将乌龟旋转30度,S30将绘制一个半径为30的圆。 我可以使程序解释一个命令,例如F100,但是如上所述,我无法使它解释长字符串。 我可以用什么方法来解释这一点。 谢谢。
2回复

在使用Python解释器运行脚本之前,如何执行一堆Python命令?

我有一个有缺陷的bzr版本,我使用python -m pdb $(which bzr) ...调用python -m pdb $(which bzr) ...来找出缺陷是什么。 缺陷在某个模块中,我想通过在python二进制文件开始解释$(which bzr) (当然这是Python脚本本身
1回复

为vim:python命令指定Python解释器

(Mac)当我使用:python时,Vim似乎正在拾取/usr/bin/python而不是我路径前面的那个( /Library/Frameworks/Python.framework/Versions/2.6/bin/python )命令。 这完全是编译时的事情还是我可以以某种方式覆盖它?