gpt4 book ai didi

Python 运行守护进程子进程并读取标准输出

转载 作者:太空狗 更新时间:2023-10-29 17:56:23 25 4
gpt4 key购买 nike

我需要运行一个程序并将其输出收集到标准输出。该程序 (socat) 需要在 python 脚本运行期间在后台运行。 Socat 在运行后会处于 dameon 模式,但首先它会向 stdout 输出一些我需要用于我的脚本其余部分的行。

命令:socat -d -d PTY: PTY:

输出:

2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/1
2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/2
2011/03/23 21:12:35 socat[7476] N starting data transfer loop with FDs [3,3] and [5,5]

...

我基本上想在我的程序开始时运行它并一直运行到脚本终止,但我需要将两个/dev/pts/X 名称读入 python。

谁能告诉我怎么做?

我想出了这个只是挂起的东西,我猜是因为它阻止了子进程的终止。

#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT

cmd = 'socat -d -d PTY: PTY: &'

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
output = p.stdout.read()

# Process the output
print(output)

感谢您的帮助

编辑:似乎它可能会写入 stderr,但脚本仍然挂起,有或没有 & 甚至从 stderr 读取。

最佳答案

#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT
import pty
import os

cmd = 'socat -d -d PTY: PTY:'

master, slave = pty.openpty()

p = Popen(cmd, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True)
stdout = os.fdopen(master)
print stdout.readline()
print stdout.readline()

你的版本有两个问题。首先,您调用 read 时不带参数,这意味着它将尝试读取所有内容。但是由于 socat 没有终止,它永远不会决定它已经读取了所有内容。通过使用 readline,python 只读取直到找到换行符。根据我对您的问题的理解,这正是您所需要的。

第二个问题是 C 标准库将缓冲管道上的输出。我们通过使用 openpty() 函数创建一个 pty 并将其传递给子进程的 stdout 和 stderr 来解决这个问题。我们使用 fdopen 将该文件描述符变成一个常规的 python 对象,我们摆脱了缓冲。

我不知道你用 socat 做什么,但我想知道是否可以用 pty 模块代替它。您正在将一个 pty 复制到另一个 pty,而 openpty 正在创建一对 pty。也许您可以直接使用它们?

关于Python 运行守护进程子进程并读取标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5411780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com