我想知道是否有一种方法可以在不杀掉进程的情况下,像处理此代码那样,通过编程来停止python脚本的执行:
1
2import sys
sys.exit()
它是相当于ctrl+c的代码
如果"停止",你的意思是"暂停,以后再继续",试试raw_input("Press Enter to continue.")或import pdb; pdb.set_trace()。
Ctrl+C抛出一个KeyboardInterrupt异常,如果未捕获,则终止进程。所以我不知道sys.exit应该有多大的不同。
另外,python是一种解释语言,这就是为什么停止脚本的执行意味着停止解释器的执行。
基本上,ctrl+c保持终端打开,对象在内存中,而sys.exit()会杀死所有东西,不,我不是说暂停。
我是电气工程师,我基本上描述了我在这里看到的,所以,在IDE Spyder中,当我在控制台上执行ctrl+c时,我会终止执行,但控制台仍然打开,并显示所有结果。使用sys.exit(),控制台将不可用。我相信这个问题是非常正确的,因为从Spyder可以实现它,只有通过键盘敲击,而不是通过实际的命令。
只是提出一个例外。
定义自己的异常,
1class HaltException(Exception): pass
把剧本包起来
1
2
3
4
5
6
7
8
9try:
# script goes here
# when you want to stop,
raise HaltException("Somebody stop me!")
except HaltException as h:
print(h)
# now what?
感谢您理解这个问题,这确实解决了问题。
您还可以将整个代码包装在函数中(不要忘记main(),如果name='main'的内容),那么当您想退出时,返回一个随机值。
这是我发现的工作——在解释器中停留,同时停止脚本。
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
4import sys
print(sys.path)
sys.exit()
-->
1
2
3
4import sys
print(sys.path)
raise ValueError()
这将在运行print(sys.path)之后立即停止python脚本的执行。尽管它会打印一个大的堆栈跟踪。但是,如果在raise ValueError()之前添加指令sys.tracebacklimit = 1,则将堆栈跟踪调用减少到一行:
1
2
3
4import sys
print(sys.path)
raise ValueError()
-->
1
2
3
4
5import sys
print(sys.path)
sys.tracebacklimit = 1
raise ValueError()
相关问题:
停止运行python脚本而不杀死解释器
在python中手动引发(引发)异常
当然,最简单的解决方案是raise KeyboardInterrupt?
这将产生与终端中的ctrl+c相同的效果,但可以在脚本中的任何位置调用。无需导入或进一步定义。
不是不正确的,但解释为什么未来是好的实践,而不仅仅是一条针对可能在4年前和今天访问此网站的人的路线。