【问题标题】:Stop running python script without killing the interpreter停止运行 python 脚本而不杀死解释器
【发布时间】:2015-05-04 05:07:44
【问题描述】:

以前,我可以在解释器中通过按Ctrl + C 来杀死以execfile("somescript.py") 开头的python 脚本,而不会杀死解释器。这将导致 KeyboardInterrupt 异常,该异常将停止脚本并让我再次使用解释器。但是,现在(我怀疑这与较新版本的 python 一起出现),当我在运行脚本时按Ctrl + C 时,它有时也会杀死解释器,让我回到 Linux 命令行。出于某种原因,并不是每次我用Ctrl + C 杀死一个脚本时都会发生这种情况。

这很烦人,因为我经常交互式地使用 python 解释器,即我用execfile("somescript.py") 运行一些脚本,玩弄它在解释器中产生的数据等等。之前,如果一些脚本卡住了,我可以杀死并且在卡住之前不会丢失它计算的数据(或者我存储在变量中的数据)。

所以我的问题是,我现在如何在解释器中杀死以execfile() 开头的python 脚本而不杀死解释器?

【问题讨论】:

  • 为什么不捕获异常和break 任何你正在运行的循环?
  • 脚本可能会在有机会处理中断之前意外完成并最终被解释器捕获。
  • 我不认为是这种情况,因为如果我没有在解释器中运行任何东西,我可以按我想要的次数按 ctrl + C 并且解释器不会被杀死。我认为这种行为与我在脚本中使用外部(非python)库这一事实有关,如果我在脚本从这些库中执行某些内容时杀死脚本,整个解释器就会以某种方式死亡。

标签: python interpreter kill-process


【解决方案1】:

通常,这是通过try 语句完成的:

>>> def f():
...     try:
...         exec(open("somefile.py").read())
...     except Exception as e: print(e)
... 
>>> f()
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in f
  File "<string>", line 4, in <module>
  File "<string>", line 3, in g
KeyboardInterrupt
>>>

somefile.py:

def g():
    while True: pass
g()

【讨论】:

  • 我当然可以这样做,但我不想用 try-catch 逻辑来弄乱我的所有脚本,以防我有时想停止脚本。我要问的是如何让 python 解释器像以前一样工作,即当我按下 Ctrl + C 时解释器永远不会被杀死。事实上,现在我尝试了,如果我只是什么都不做的时候按Ctrl+C。当我运行一些脚本时,它只会偶尔杀死它。
  • @Echows 如果问题是间歇性的,那么您需要努力重现问题。如果您在发现问题后无法解决问题,那么您可以提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2023-03-18
相关资源
最近更新 更多