是否可以在 python 中中断 Popen 子进程?

Posted

技术标签:

【中文标题】是否可以在 python 中中断 Popen 子进程?【英文标题】:Is it possible to interrupt Popen subprocess in python? 【发布时间】:2021-02-16 01:52:28 【问题描述】:
from subprocess import Popen, PIPE
command = "ping google.com -t"
with Popen(["cmd", "/c", command], stdout=PIPE, bufsize=1,
           universal_newlines=True) as p:
    for line in p.stdout:
        print(line.strip())

我正在使用 Popen 运行命令行参数并捕获输出。我想根据用户的输入发送击键以停止此操作,但我不确定如何中断子进程。在上面的例子中,“Ctrl C”是必需的,但在我的代码中我只需要发送字母“q”。

可以这样做吗?

【问题讨论】:

p.terminte()p.kill() 有效,但是您的示例令人困惑,因为您没有使用击键作为程序的输入。 我正在运行的可执行文件而不是“ping google”除了作为初始参数外不接受任何输入。 p.kill() 和 p.terminate() 停止可执行文件,但是如果我在运行它时在 cmd 中发送“q”,则可执行文件会安全地自行停止(因为它已连接到设备)。我正在尝试将其包装在不依赖命令行参数的 GUI 中。 【参考方案1】:
import keyboard  # using module keyboard
from subprocess import Popen, PIPE


command = "ping google.com -t"


while True:  # making a loop
    try:

        with Popen(["cmd", "/c", command], stdout=PIPE, bufsize=1,
               universal_newlines=True) as p:
            for line in p.stdout:
                print(line.strip())

          # used try so that if user pressed other than the given key error will not be shown
        if keyboard.is_pressed('q'):  # if key 'q' is pressed 
            print('EXIT  !')
            p.kill()
            break  # finishing the loop
    except:
        break

【讨论】:

以上是关于是否可以在 python 中中断 Popen 子进程?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将subprocess.Popen的stdout重新连接到sys.stdout? (python3)

中断调用函数 popen 的进程

如何为 popen 指定工作目录

子进程子回溯

python 多线程 popen ping指定IP是否在线 判断连通

Python 的 subprocess.Popen 是不是接受路径中的空格?