使用Unix套接字处理子进程的stdin、stdout、stderr

1 投票
1 回答
1406 浏览
提问于 2025-04-17 18:31

我想用Python把一个游戏服务器的进程封装起来,这样我就可以通过一个套接字从其他程序访问它的控制台。我希望能读取标准输出(stdout)、标准错误(stderr),并且能够通过标准输入(stdin)发送数据,以便通过套接字与服务器进行通信。

到目前为止,我尝试了这样的代码:

sock = socket.socket(socket.AF_UNIX)
sock.setblocking(0)
sock.bind('server.sock')
sock.listen(5)
sock.accept()
fd = sock.makefile()

proc = subprocess.Popen(args, stdin=fd, stdout=fd, stderr=fd)

我可以连接到server.sock这个Unix套接字,但当我期待服务器有输出时,却从来没有读取到任何数据。

1 个回答

1

你不能忽视 sock.accept() 的返回值:它会返回一个元组,元组里的第一个元素是一个 已连接 的套接字对象。这个对象和 sock 是不一样的,因为 sock 只是用来接受(可能是多个)连接的。你需要在这个已连接的套接字对象上调用 makefile(),而不是在原来的 sock 上调用。

撰写回答