2016-05-15 5 views
0

Der Code ist der folgende (auf Python 2.7 Prompt)wie Subprocess.Popen das gesamte stdout abrufen?

import subprocess as sp 

a = sp.Popen(['bash', '-c', 'ssh [REDACTED] cat text.txt'], 
      stdout=sp.PIPE, stderr=sp.PIPE)  
print(a.communicate()[0]) 

ich dieses Programm erwarten würde die gesamte „text.txt“ Datei zu drucken, ist es jedoch die letzten Zeilen fehlt.

Die Datei text.txt befindet sich auf einem Remote-Server, von dem ich annehme, dass es der Kern davon ist. Wenn ich die Datei abrufe und dann subprocess.Popen lokal ausführe, funktioniert es wie erwartet.

Warum passiert es und wie kann ich es beheben?

Anmerkung: das Ergebnis ist das gleiche, wenn ich check_output

+0

Wenn Sie diesen SSH-Befehl lokal ausführen, erhalten Sie die vollständige Datei oder fehlen auch die letzten Zeilen? – amiller27

+0

Ich bekomme die vollständige Datei. Der Remote-Server macht vielleicht etwas Lustiges und sendet nicht alles irgendwie durch stdout? –

+0

Was passiert, wenn Sie Folgendes ausführen: 'print (repro (subprocess.check_output (shlex.split ('ssh " cat text.txt "'))))'? – jfs

Antwort

0

verwenden Nach dem documentation for communicate, sollte der Befehl nicht verwendet werden, wenn die Datengröße sehr groß ist. Versuchen Sie etwas wie this und sehen Sie, ob das Ihr Problem löst.

+0

es hat es nicht gelöst, und die Größe sollte nicht massiv sein (der txt selbst ist nicht massiv mindestens) –

+0

Was passiert, wenn Sie 'text.txt' lokal speichern und dann ersetzen Sie Ihren' ssh' Befehl mit nur 'Katze text.txt'? – amiller27

+0

dann funktioniert es wie erwartet. Ich bekomme die ganze Sache. –