您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python运行守护程序子进程并读取stdout

Python运行守护程序子进程并读取stdout

#!/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 2022/1/1 18:39:09 有251人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶