【问题标题】:How to stop a Python script but keep interpreter going如何停止 Python 脚本但让解释器继续运行
【发布时间】:2017-01-19 17:31:20
【问题描述】:

我有一个 Python 脚本,我想将它执行到某个点,然后停止,并保持解释器打开,这样我就可以看到它定义的变量等。

我知道我可以生成一个异常,或者我可以通过运行pdb.set_trace() 来调用调试器,然后停止我当前使用的调试器。

...但是是否有一个命令可以停止脚本,就好像它已经结束了一样?这相当于注释整个脚本的其余部分(但我不想这样做),或者将早期的 return 语句放在函数中。

似乎必须存在这样的东西,但我到目前为止还没有找到它。

编辑:我的用例的更多细节

我通常在 Spyder 中使用常规的 Python 控制台。 IPython 似乎是件好事,但是(至少对于我目前使用的版本,2.2.5)一些普通控制台的功能在 IPython 中不能很好地工作(自省、自动完成)。 通常情况下,我的代码会生成 matplotlib 图形。在调试模式下,这些无法更新(据我所知),这就是为什么我需要完全脱离脚本,而不是解释器)。 调试器的另一个限制是我不能在其中执行循环:您可以将循环的代码复制/粘贴到常规控制台中并让它执行,但这在调试器中不起作用(至少在我的 Spyder 中)版本)。

【问题讨论】:

  • 不能说任何特定的命令,但 PyCharm 是一个非常可爱的 IDE,它可以让你做这样的事情。它甚至可以让您在遇到断点时对范围内的任何变量计算任意表达式。
  • 为什么不直接使用 pdb 并在您希望代码停止的位置设置断点?

标签: python python-2.7


【解决方案1】:

如果您使用python -i <script> 调用您的程序,则解释器将在脚本结束后保持活动状态。 raise SystemExit 将是强制它在任意点结束的最简单方法。

【讨论】:

  • 这似乎在 IPython 中工作得很好,如果我在专用实例中启动脚本,它在常规解释器中也能工作。如果我从以前打开的控制台运行它,它将与脚本一起关闭控制台。是否有另一个异常导致没有回溯并且不会关闭控制台?我尝试过的所有其他异常都会使控制台保持打开状态,但会导致回溯。可以接受但不漂亮。
【解决方案2】:

如果你有 ipython(强烈推荐),你可以到程序中的任何地方添加以下行

import IPython
IPython.embed()

一旦您的程序到达该点,embed 命令将在该上下文中打开一个新的 IPython shell。

对于我不想走完整 pdb 路线的事情,我真的很喜欢这样做。

【讨论】:

  • 我刚刚尝试过,它很漂亮,甚至在非 IPython 控制台中运行时也能正常工作,我可以使用 exit() 继续执行。 - 我发现的问题是 matplotlib 数字被冻结,与调试器一样,我无法通过输入它们的名称并按 Enter 来查询单字母变量(如在调试器中),并且如果我运行其余的脚本,它似乎让我进入了一个 IPython 控制台,尽管它以前是一个普通的控制台。 -- 哦,从 IPython 控制台运行时它不起作用!对我来说没问题,但应该提及。
  • 嗯,这很奇怪,我可以在那里毫无问题地使用 matplotlib。查询变量也不是问题。
  • 内联图形工作,但我所有的程序都使用 QT 后端和分离的窗口。我可以更新它们,但只有在让程序继续运行后才能看到更改。对于变量,我通常使用变量 instpector,但只定义a=5,然后只需输入a 并回车即可。在我的情况下没有反应,虽然它适用于a_variable=5,并且a+2 也可以正常工作。这可能是 Spyder 中的东西。很容易解决,但很烦人。
  • 我将 runserver_plus 用于 django,但我也在寻找类似的东西来在控制台中进行测试。这正是我想要的。否则 pdb 很痛苦
【解决方案3】:

如果您使用的是 Python Shell,只需按 CTRL + C 即可引发 KeyboardInterrupt。然后,您可以在抛出异常时检查程序的状态。

x = 0
while True:
    x += 1

运行脚本...

Python 2.7.6(默认,2013 年 11 月 10 日,19:24:18)[MSC v.1500 32 位(英特尔)] 在 win32 上 键入“copyright”、“credits”或“license()”以获取更多信息。 >>> ================================= 重新开始 ============== ===================

Traceback(最近一次调用最后一次):

文件“C:/Python27/test.py”,第 2 行,在

当真时:

键盘中断

>>> x

15822387

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2015-04-11
    • 2016-01-17
    • 2014-04-18
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多