使用Unix套接字处理子进程的stdin、stdout、stderr
我想用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
上调用。