python құбырының ішкі процесі i/o ұяшығына үстінде

Мен сонда да осындай сұрақтар бар екенін білемін, бірақ мен бұл нақты мысалмен қиындық көріп, жақсы жауап таба алмадым. Мен dar үшін қашықтағы резервтік серверді орнатуға тырысамын, осы жолдар бойында . Мен netcat-ды subprocess.Popen-ды шақыру арқылы орындау туралы бөлек мәселені сұрадым, бірақ мен розеткалар және мүмкіндігінше питонмен барлық құбырларды жасаңыз. Бірнеше концерт берілді, сондықтан мен алдымен барлық кірісті оқып шығып, одан кейін жібере алмаймын.

Мәселе мынада, бұл сервер деректерді оқу сияқты емес.

Қазіргі кезде менде келесі код бар:

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
1

1 жауаптар

Сервердегі dar_xform пәрмені сәтсіз аяқталды ...

dar_xform пәрменіне толық жолды subprocess.Popen (...) жолына келтіріп көріңіз және ақауды жалғастырасыз ба. Сіз сипаттаған нәрсе PATH мәселесі сияқты күдікті түрде көрінеді, әсіресе ол қабықтың шақыруында жұмыс істейтіндіктен.

0
қосылды
Бұл, бәлкім, ақымақтық мәселе, бірақ сіз dar_xform /usr/bin ішінде екеніне сенімдісіз бе?
қосылды автор larsks, көзі
Мен оны жұмыс істегеніне қуаныштымын.
қосылды автор larsks, көзі
Жақсы ой, бірақ ол әлі де сәтсіздікке ұшырайды. Мен оларды сұраққа қосу үшін редакцияладым.
қосылды автор Aryeh Leib Taurog, көзі
Ия. Тікелей мәселе - бос емес үтір болды, мен оны попамен орындайды. Мен екі жолды біріктіріп алған «/ usr/bin/dar_xform-s» іздегенін көрдім. 13 жұп көзді жіберіп алды. Мен мәселені жаңарттым.
қосылды автор Aryeh Leib Taurog, көзі
Жауапты қабылдаймын, себебі сіз қатені диагноз қойдыңыз. Қалған мәселелер шынымен осы тақырыптағы менің басқа сұрағыма ұқсас.
қосылды автор Aryeh Leib Taurog, көзі