蟒管子I / O插座上(python pipe subprocess i/o over socket

2019-09-28 22:07发布

我知道有类似的问题在那里,但我有这个具体的例子麻烦了,还没有找到一个很好的答案。 我试图设立DAR远程备份服务器, 沿着这些路线 。 我问一个单独的问题,关于由与subprocess.Popen调用的netcat这样做,但我宁愿设立的套接字和做所有的管道与Python如果可能的话。 会有几个音乐会转移,所以我不能只是先读所有的输入,然后将它传递。

问题是,服务器似乎并没有被读取数据。

目前,我有下面的代码:

from socket import socket, AF_INET, SOCK_STREAM
import sys
import SocketServer
import subprocess

class DarHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print('entering handler')
        data = self.request.recv(1024).strip()
        print('got: ' + data)
        if data == 'xform':
            s = socket(AF_INET, SOCK_STREAM)
            s.bind(('',0))
            myaddr, myport = s.getsockname()
            print('bound new socket to {0}:{1}'.format(myaddr, myport))
            self.request.send(str(myport))
            s.listen(1)
            conn, remoteaddr = s.accept()
            print('accepted connection from {0}:{1}'.format(*remoteaddr))
            xform_input = conn.makefile('rb',0)
            proc = subprocess.Popen(
                ['/usr/bin/dar_xform', '-s', '10k', '-', 'archives/sockbackup',],
                 stdin=xform_input
            )
            return_code = proc.wait()
            print('dar_xform returned {0}'.format(return_code))
            conn.close()
            self.request.send(str(return_code))
        else:
            self.request.send('bad request')
        print('send result, exiting handler')

server_address = ('localhost', 18010)
def server():
    server = SocketServer.TCPServer(server_address, DarHandler)
    print('listening')
    server.serve_forever()

def client():
    sock = socket(AF_INET, SOCK_STREAM)
    print('connecting to server')
    sock.connect(('localhost', 18010))
    print('connected, sending request')
    sock.send('xform')
    print('waiting for response')
    port = sock.recv(1024)
    print('got: ' + port)
    s = socket(AF_INET, SOCK_STREAM)
    s.connect(('localhost', int(port)))
    print('connected to dar_xform port')
    dar_output = s.makefile('wb',0)
    return_code = subprocess.call(
          ['/usr/bin/dar', '-B', 'config/test.dcf', '-c', '-',], 
          stdout=dar_output
    )
    print('dar returned {0}'.format(return_code))
    s.close()
    result = sock.recv(1024)
    print('received: ' + result)
    sock.close()
    print('socket closed, exiting')

if __name__ == "__main__":
    if sys.argv[1].startswith('serv'):
        server()
    else:
        client()

我从服务器端下面的输出,当我运行客户端:

listening
entering handler
got: xform
bound new socket to 0.0.0.0:41658
accepted connection from 127.0.0.1:42440

然后,它只是坐在那里。 同时, dar运行在客户端和客户端被卡住等待服务器的响应:

connecting to server
connected, sending request
waiting for response
got: 41300
connected to dar_xform port


 --------------------------------------------
 53 inode(s) saved
 with 0 hard link(s) recorded
 0 inode(s) changed at the moment of the backup
 0 inode(s) not saved (no inode/file change)
 0 inode(s) failed to save (filesystem error)
 1 inode(s) ignored (excluded by filters)
 0 inode(s) recorded as deleted from reference backup
 --------------------------------------------
 Total number of inodes considered: 54
 --------------------------------------------
 EA saved for 0 inode(s)
 --------------------------------------------
dar returned 0

Answer 1:

它看起来像在服务器上dar_xform命令失败...

请尝试提供的完整路径dar_xform指挥subprocess.Popen(...)看看如果你继续有问题。 你所描述看起来很像一个PATH问题,特别是因为它工作在shell提示符。



文章来源: python pipe subprocess i/o over socket