2016-08-01 90 views
1

umgehen Ich versuche, große Dateien über ssh zu streamen, und kann gerade Raw-Dateien gut streamen; als:Wie stdout von Befehl wie "mit open() als f:" in Python

with open('somefile','r') as f: 
    tx.send(filepath='somefile',stream=f.read()) 

tx eine höhere Instanz der Klasse ist, die ich habe, dass gerade fein auf diese Weise strömen kann, aber ich möchte in der Lage sein, Befehle zu verwenden, wie pv, dd und tar auch streamen. Was ich brauche ist:

with run_some_command('tar cfv - somefile') as f: 
    tx.send(filepath='somefile',stream=f.read()) 

Dies würde stdout als Stream nehmen und in eine Remote-Datei schreiben. Ich habe versucht, etwas zu tun, wie:

p = subprocess.Popen(['tar','cfv','-','somefile'], stdout=subprocess.PIPE) 
tx.send(filepath='somefile',stream=p.stdout.readall()) 

aber ohne Erfolg ... Ich habe für eine Weile googeln versuchen, ein Beispiel zu finden, aber kein Glück so weit. Jede Hilfe wäre sehr willkommen!

Antwort

0

Ich denke, dass das einzige Problem ist die .readall() Methode, die nicht existiert.

können Sie p.stdout.read() verwenden Sie den gesamten Inhalt von stdout zu lesen:

p = subprocess.Popen(['tar','cfv','-','somefile'], stdout=subprocess.PIPE) 
tx.send(filepath='somefile',stream=p.stdout.read()) 
0

ich mit einem einfachen Beispiel ging zurück und begann:

calc_table_file = '/mnt/condor/proteinlab/1468300008.table' 

import subprocess 
class TarStream: 
    def open(self,filepath): 
    p = subprocess.Popen(['tar','cfv','-',filepath], stdout=subprocess.PIPE) 
    return(p.stdout) 


import paramiko 


def writer(stream): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect('asu-bulk-uspacific', username='labtech', password=password) 
    client = ssh.open_sftp() 
    with client.open('/mnt/cold_storage/folding.table','w') as f: 
    while True: 
     data = stream.read(32) 
     if not data: 
     break 
     f.write(data) 

## works with normal 'open' 
with open(calc_table_file,'r') as f: 
    writer(f) 

## and popen :) 
tar = TarStream() 
writer(tar.open(calc_table_file)) 

und es funktionierte! Danke für die Hilfe.