Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字上的python管道子进程i/o_Python_Subprocess_Python Sockets - Fatal编程技术网

套接字上的python管道子进程i/o

套接字上的python管道子进程i/o,python,subprocess,python-sockets,Python,Subprocess,Python Sockets,我知道也有类似的问题,但是我在这个具体的例子中遇到了问题,并且没有找到一个好的答案。我正在尝试为dar设置远程备份服务器。我已经问过一个关于通过调用netcat和subprocess.Popen来实现这一点的问题,但是如果可能的话,我更愿意设置套接字并使用python完成所有管道。将有几个Gig被传输,所以我不能先读取所有的输入,然后再传递 问题是服务器似乎没有读取数据 目前,我有以下代码: from socket import socket, AF_INET, SOCK_STREAM impo

我知道也有类似的问题,但是我在这个具体的例子中遇到了问题,并且没有找到一个好的答案。我正在尝试为dar设置远程备份服务器。我已经问过一个关于通过调用netcat和subprocess.Popen来实现这一点的问题,但是如果可能的话,我更愿意设置套接字并使用python完成所有管道。将有几个Gig被传输,所以我不能先读取所有的输入,然后再传递

问题是服务器似乎没有读取数据

目前,我有以下代码:

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_xform命令似乎失败了


尝试提供到
subprocess.Popen(…)
dar_xform
命令的完整路径,并查看是否仍然存在问题。您所描述的内容看起来可疑地像一个
路径问题,特别是因为它在shell提示符下工作。

这是一个好主意,但仍然失败。我已经编辑了这个问题以包含它们。这可能是一个愚蠢的问题,但是您确定
dar\u xform
/usr/bin
中吗?是的。直接的问题是缺少一个逗号,我通过将shell=True添加到Popen中发现了它。我看到它正在寻找通过连接两个字符串得到的“/usr/bin/dar_xform-s”。13双眼睛错过了那一双。我已经更新了问题。我接受你的答案,因为你正确地诊断了错误。问题的其余部分实际上与其他部分完全相同。 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