2017-07-25 6 views
0

Ich bin mit einem subprocess interagieren und versuchen zu erkennen, wenn es für meine Eingabe bereit ist. Das Problem, das ich habe, ist, dass die Lese- oder readline Funktionen auf dem Trennzeichen '\ n' am Ende der Zeile oder einem EOF angewiesen sind. Da diese subprocess nie beendet wird, gibt es kein EOF in dem dateiähnlichen Objekt. Da das Schlüsselwort, von dem ich auslösen möchte, dieses Trennzeichen nicht enthält, liefern die Funktionen read und readline niemals. Zum Beispiel:Python benutzerdefinierte Trennzeichen für lesen oder readline

'Doing something\n' 
'Doing something else\n' 
'input>' 

Da dieser Prozess nie verlassen hat, die Lese- oder Leseleitung nie ein EOF oder \n, die es erfordert, erhalten sehen.

Gibt es eine Möglichkeit, diese Datei wie ein Objekt zu lesen und ein benutzerdefiniertes Trennzeichen auf input> zu setzen?

def custom_readlines(handle, line_separator="\n", chunk_size=64): 
    buf = "" # storage buffer 
    while not handle.closed: # while our handle is open 
     data = handle.read(chunk_size) # read `chunk_size` sized data from the passed handle 
     if not data: # no more data... 
      break # break away... 
     buf += data # add the collected data to the internal buffer 
     if line_separator in buf: # we've encountered a separator 
      chunks = buf.split(line_separator) 
      buf = chunks.pop() # keep the last entry in our buffer 
      for chunk in chunks: # yield the rest 
       yield chunk + line_separator 
    if buf: 
     yield buf # return the last buffer if any 

Leider wegen Python Standardpuffer Richtlinien, die Sie nicht in der Lage sein, große Schwaden von Daten zu ergreifen, wenn sie von nicht vorgesehen sind:

+0

Können Sie Ihren Code anzeigen? (ein kleines minimales Beispiel) –

+0

Wir brauchen wirklich [mcve], um Ihnen bei diesem Problem zu helfen. –

+0

Lesen Sie jeweils das eingegebene Zeichen. – Goyo

Antwort

0

Sie können Ihre eigene readlines Funktion und wählen Sie das Trennzeichen selbst implementieren den Prozess, den Sie anrufen, aber Sie können immer auf die chunk_size auf 1 setzen und dann die Eingabe Zeichen für Zeichen lesen. Also, für Ihr Beispiel, alles, was Sie tun müssen, ist:

import subprocess 

proc = subprocess.Popen(["your", "subprocess", "command"], stdout=subprocess.PIPE) 

while chunk in custom_readlines(proc.stdout, ">", 1): 
    print(chunk) 
    # do whatever you want here... 

Und es sollte alles erfassen bis zu > von Ihrem Subprozesse STDOUT. Sie können in dieser Version auch mehrere Zeichen als Trennzeichen verwenden.

+0

Danke! Ich war in der Nähe Ich hatte eine grobe Umsetzung der oben genannten, aber es klickte nicht für mich eine chunk_size von 1 zu verwenden – wdoler

Verwandte Themen