2016-12-04 4 views
0

Ich versuche Zeilen vom tcp Server zu lesen, die ich im selben Skript ausgeführt habe. Ich bin in der Lage, einen Befehl zu senden und liest seine Ausgabe, aber am Ende (nach dem Lesen aller Ausgänge) sieht es aus wie das Programm in Readline hängt, habe ich fast alle Lösungen here und here versucht, aber immer noch es hängt.Python Subprozess readline hängt() nach dem Lesen aller Eingaben

Die meisten dieser Lösungen schlagen vor, zu prüfen, ob die Ausgabe von readline keine oder nicht ist, aber in meinem Fall kehrt das Programm nie vom letzten Lesevorgang zurück und bleibt einfach dort hängen.

Bearbeiten: Tcp-Server ist nicht in meiner Kontrolle, oder sagen, ich muss nur Server-Skript testen, daher kann ich es nicht ändern. Ist es auch möglich, Befehle mit Python an running server zu senden, ohne den Subprozess zu benutzen? eine bessere Alternative?

def subprocess_cmd(command): 
    process=subprocess.Popen(command,stdin=subprocess.PIPE,stderr=subprocess.STDOUT,stdout=subprocess.PIPE, shell=True) 

for cmd in ['python3 -u tcp_server.py 123 port1']: 
    subprocess_cmd(cmd) 

process.stdin.write('command like print_list') 
process.stdin.flush() 
while True: 
    line=process.stdout.readline() 
    if line == '': 
     break 
+0

Sie müssten Ihren Code veröffentlichen, damit wir Ihnen helfen können. –

+0

@ Jean-FrançoisFabre Code wurde hinzugefügt –

Antwort

1

readline hängt, weil Ihre TCP-Verbindung noch offen ist und readline erwartet mehr Daten kommen. Sie müssen die Verbindung von Server-Seite schließen readline zu benachrichtigen, dass es nichts mehr zu lesen ist. In der Regel geschieht dies, indem der Socket auf der Client-Seite geschlossen wird und der Server benachrichtigt wird, dass keine weiteren Anfragen mehr an ihn gesendet werden. Wenn der Server alle Befehle verarbeitet, schließt er auch den Socket. Und dies ist das Signal für Sie, dass Sie alle Daten erhalten haben, die der Server an Sie gesendet hat.

Oder alternativ, wenn Sie die Verbindung nicht schließen möchten, müssen Sie Trennzeichen erfinden, die das Ende der Antwort markieren werden. Der Client hört also auf, readline aufzurufen, wenn ein solches Trennzeichen gelesen wird.

+0

Sie haben Recht, ich habe auch dasselbe Gefühl darüber. Aber bitte lies meinen Schnitt und lass mich wissen, wenn ich etwas tun kann? –

+0

Gemäß Ihrem Code ist tcp_server.py kein TCP-Server. Zumindest kommunizierst du mit Standard-Input/Output-Streams, nicht mit TCP. Wie auch immer, der Grund ist der gleiche: Sie schließen nicht die Standardversion. Und der beste Weg, dies zu tun ist, 'subprocess.communicate' zu ​​verwenden. Der Grund ist in der Dokumentation der Funktion beschrieben. –

+0

ok danke für das clearing des konzepts. Akzeptierte deine Antwort –

Verwandte Themen