停止python脚本而不杀死python进程

Stop python script without killing the python process

我想知道是否有一种方法可以在不杀掉进程的情况下,像处理此代码那样,通过编程来停止python脚本的执行:

1
2
import sys
sys.exit()

它是相当于ctrl+c的代码


定义自己的异常,

1
class HaltException(Exception): pass

把剧本包起来

1
2
3
4
5
6
7
8
9
try:
    # script goes here

    # when you want to stop,
    raise HaltException("Somebody stop me!")

except HaltException as h:
    print(h)
    # now what?


这是我发现的工作——在解释器中停留,同时停止脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ------------------------------------------------------------------
# Reset so get full traceback next time you run the script and a"real"
# exception occurs
if hasattr (sys, 'tracebacklimit'):
    del sys.tracebacklimit

# ------------------------------------------------------------------
# Raise this class for"soft halt" with minimum traceback.
class Stop (Exception):
    def __init__ (self):
        sys.tracebacklimit = 0

# ==================================================================
# ... script here ...
if something_I_want_to_halt_on:
    raise Stop ()

# ... script continues ...


我在开发高级文本包时遇到了这个问题。我试图停止一个优秀的文本python包,在重新加载包时测试一些东西。

如果我调用sys.exit(),我会杀死sublime text python解释器,需要重新启动sublime text。但是在搜索之后,我发现解决方案很简单,我只需要调用raise ValueError(),而不是sys.exit()

1
2
3
4
import sys
print(sys.path)

sys.exit()

-->

1
2
3
4
import sys
print(sys.path)

raise ValueError()

这将在运行print(sys.path)之后立即停止python脚本的执行。尽管它会打印一个大的堆栈跟踪。但是,如果在raise ValueError()之前添加指令sys.tracebacklimit = 1,则将堆栈跟踪调用减少到一行:

1
2
3
4
import sys
print(sys.path)

raise ValueError()

-->

1
2
3
4
5
import sys
print(sys.path)

sys.tracebacklimit = 1
raise ValueError()

相关问题:

  • 停止运行python脚本而不杀死解释器
  • 在python中手动引发(引发)异常

  • 当然,最简单的解决方案是raise KeyboardInterrupt

    这将产生与终端中的ctrl+c相同的效果,但可以在脚本中的任何位置调用。无需导入或进一步定义。