如何在 Python 中启动、监视和终止进程

How to launch, monitor and kill a process in Python

我需要能够在 Python 中启动一个长 运行 进程。虽然进程是 运行,但我需要将输出通过管道传输到我的 Python 应用程序以在 UI 中显示它。 UI 还需要能够终止进程。

我做了很多研究。但我还没有找到一种方法来完成所有这三件事。

subprocess.popen() 让我启动一个进程并在需要时终止它。但是在该过程完成之前,它不允许我查看其输出。我正在监视的过程永远不会自行完成。

os.popen() 让我启动一个进程并监控其输出 运行。但我不知道有什么方法可以杀死它。我通常在调用 readline() 的过程中。

当使用os.popen()时,有没有办法在调用read()或readline之前知道缓冲区中是否有数据?例如...

output = os.popen(command)
while True:
    # Is there a way to check to see if there is any data available
    # before I make this blocking call?  Or is there a way to do a 
    # non-blocking read?
    line = output.readline()
    print(line)

提前致谢。

我建议 subprocess.Popen 对流程进行细粒度控制。

import subprocess


def main():
    try:
        cmd = ['ping', '8.8.8.8']
        process = subprocess.Popen(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True,
            bufsize=1,
            text=True
        )
        while True:
            print(process.stdout.readline().strip())

    except KeyboardInterrupt:
        print('stopping process...')
        process.kill()


if __name__ == '__main__':
    main()
  • stdoutstderr kwargs 设置为 subprocess.PIPE 允许您通过 .communicate 读取各自的流,而不是将它们打印到父流(因此它们会出现在您 运行 脚本中的终端中)
  • .kill() 允许您随时终止进程
  • process.stdoutprocess.stderr 可以随时通过 readline() 查询以获得它们的当前行,或者通过 read()readlines()