python管道子进程通过套接字进行输入/输出 [英] python pipe subprocess i/o over socket

查看:139
本文介绍了python管道子进程通过套接字进行输入/输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道那里也有类似的问题,但是我在这个具体示例上遇到了麻烦,并且没有找到一个好的答案.我正在尝试为dar,沿这些行设置远程备份服务器.我已经问过单独的问题有关通过使用subprocess.Popen调用netcat来做到这一点,但是我更愿意设置套接字,并在可能的情况下使用python进行所有管道传输.将会有几场演出被转移,所以我不能只是先阅读所有输入然后再传递.

I know there are similar questions out there, but I'm having trouble with this concrete example, and haven't found a good answer. I'm trying to set up a remote backup server for dar, along these lines. I've asked a separate question about doing this by invoking netcat with subprocess.Popen, but I'd prefer to set up the sockets and do all the piping with python if possible. There will be several gigs transferred, so I can't just read all the input first and then pass it on.

问题在于服务器似乎没有在读取数据.

The problem is that the server doesn't seem to be reading the data.

此刻,我有以下代码:

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()

运行客户端时,我从服务器端获得以下输出:

I get the following output from the server side when I run the client:


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

然后就坐在那里.同时,dar在客户端上运行,并且客户端被卡在等待服务器的响应:

Then it just sits there. Meanwhile, dar runs on the client and the client is stuck waiting for a response from the server:


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

推荐答案

服务器上的dar_xform命令似乎失败...

It looks like the dar_xform command on the server is failing...

尝试提供dar_xform命令到subprocess.Popen(...)的完整路径,并查看是否仍然存在问题.您所描述的内容看起来像是一个PATH问题,尤其是因为它在shell提示符下有效.

Try providing a full path to the dar_xform command to subprocess.Popen(...) and see if you continue to have a problem. What you've described looks suspiciously like a PATH issue, especially since it works at the shell prompt.

这篇关于python管道子进程通过套接字进行输入/输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆