【问题标题】:How to stop/terminate a python script from running? (once again)如何停止/终止运行 python 脚本? (再来一次)
【发布时间】:2020-04-10 06:04:55
【问题描述】:

上下文

我有一个正在运行的 python 脚本。它在一个循环中包含许多 os.system("./executableNane") 调用。

如果我按下 ctrl + C,它只会停止当前./executableNane 的执行并传递到下一个。

问题

如何停止整个脚本的执行,而不仅仅是当前调用的可执行文件的执行?

请注意,我已仔细阅读问题/答案here,但即使使用kill,我也可以杀死可执行文件executableNane,但不能杀死整个脚本(即我找不到使用top)。

我必须停止脚本(无需重新启动系统)的唯一方法是继续循环按 ctrl + C 直到所有测试完成。

【问题讨论】:

  • 尝试使用 subprocess.popen()?
  • 不是来自脚本内部,而是来自外部
  • 试试 ctrl-break。
  • @MarkTolonen,测试了您建议的组合键,它确实有效。
  • 考虑使用subprocess 而不是os.system

标签: python python-3.x


【解决方案1】:

您可以使用subprocesssignal handlers 来执行此操作。您还可以使用subprocess 通过subprocess.PIPE 接收和发送信息,您可以在文档中了解更多信息。

以下应该是您要执行的操作的基本示例:

import subprocess
import signal
import sys

def signal_handler(sig, frame):
    print("You pressed Ctrl+C, stopping.")
    print("Signal: {}".format(sig))
    print("Frame: {}".format(frame))

    sys.exit(123)

# Set up signal handler
signal.signal(signal.SIGINT, signal_handler)

print("Starting.")
while True:
    cmd = ['sleep', '10']
    p = subprocess.Popen(cmd)
    p.wait()
    if p.returncode != 0:
        print("Command failed.")
    else:
        print("Command worked.")

【讨论】:

  • +1 我会尽快尝试解决方案 我会在我正在处理的另一个项目上回到昨天的问题!
  • @Leos313 由于代表,我无法评论您的答案,但Ctrl-Z 暂停执行您的程序,而不是停止它。因为os.system() 是一个阻塞调用,所以您的Python 进程正在等待executableName 进程完成。您正在暂停当前正在运行的 executableName 进程,因此您的 Python 进程仍在等待它完成。如果您使用bgfg 继续该过程,则该过程将准确地从您中断的地方继续。请记住,使用 Ctrl-Z 不会进行任何清理,因为进程尚未退出(文件仍处于打开状态等...)。
【解决方案2】:

与我找到的解决方案相比,该问题的另一个解决方案(@Quillan Kaseman)要优雅得多。当我按 Ctrl + Z 而不是 Ctrl + C 时,我所有的问题都解决了。

确实,我不知道为什么 Z 有效而 C 无效。 (稍后我会尝试寻找一些细节)。

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2021-03-20
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2019-07-17
    • 2014-09-26
    相关资源
    最近更新 更多