2017-07-25 3 views
0

J'interagis avec un subprocess et essaye de détecter quand il est prêt pour mon entrée. Le problème que je rencontre est que les fonctions read ou readline reposent sur le délimiteur '\ n' en fin de ligne, ou sur un EOF à céder. Puisque ce subprocess ne se termine jamais, il n'y a aucun EOF dans le fichier comme objet. Puisque le mot-clé que je veux déclencher ne contient pas ce délimiteur, les fonctions read et readline ne cèdent jamais. Par exemple:Délimiteur personnalisé Python pour lecture ou readline

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

Depuis ce processus sort jamais, la lecture ou la ligne jamais lu un EOF voir ou \n qui exige qu'elle le fasse.

Y at-il un moyen de lire ce fichier comme objet et de définir un délimiteur personnalisé à input>?

+0

Pouvez-vous montrer votre code? (un petit exemple minimal) –

+0

Nous avons vraiment besoin d'un [mcve] pour vous aider avec ce problème. –

+0

Lire l'entrée un caractère à la fois. – Goyo

Répondre

0

Vous pouvez implémenter votre propre fonction readlines et choisissez le délimiteur vous:

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 

Malheureusement, en raison des politiques de mise en mémoire tampon par défaut Python vous ne serez pas en mesure de saisir de grandes étendues de données si elles ne sont pas fournis par le processus que vous appelez, mais vous pouvez toujours utiliser la valeur chunk_size pour 1, puis lire le caractère d'entrée par caractère. Ainsi, par votre exemple, tout ce que vous devez faire est:

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... 

Et il devrait capturer tout jusqu'à > de STDOUT de votre sous-processus. Vous pouvez également utiliser plusieurs caractères comme séparateurs dans cette version.

+0

Merci! J'étais proche j'ai eu une mise en œuvre approximative de ce qui précède, mais il n'a pas cliqué pour moi d'utiliser un chunk_size de 1 – wdoler