Comment interagir correctement avec un processus à l'aide d'un module de sous-processus

StackOverflow https://stackoverflow.com/questions/443057

  •  22-07-2019
  •  | 
  •  

Question

J'ai des problèmes pour rediriger la stdio d'un autre programme à l'aide du module de sous-processus. Il suffit de lire à partir de stdout pour suspendre Popen.communicate (), mais cela ferme les tuyaux après lecture / écriture. Quel est le moyen le plus simple de mettre en œuvre cela?

Je jouais avec cela sur Windows:

import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
                        shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)
while True:
    proc.stdin.write('world\n')
    proc_read = proc.stdout.readline()
    if proc_read:
        print proc_read
Était-ce utile?

La solution

Ne correspond pas à 100% à votre exemple, mais aide à comprendre le problème sous-jacent: le processus P démarre l'enfant C. L'enfant C écrit quelque chose sur sa sortie standard. La sortie standard de C est un tuyau qui a un tampon de 4096 caractères et la sortie est plus courte que cela. Maintenant, C attend quelques informations. Pour C, tout va bien.

P attend la sortie qui ne viendra jamais car le système d'exploitation ne voit aucune raison de vider le tampon de sortie de C (avec si peu de données). Puisque P n’obtient jamais la sortie de C, il n’écrira jamais rien dans C, C se bloque alors dans l’attente de l’entrée de P.

Correction: après chaque écriture, un vidage sur un tuyau forçait le système d'exploitation à envoyer les données maintenant .

Dans votre cas, ajouter proc.stdin.flush () dans la boucle While principale et un sys.stdout.flush () dans la boucle enfant après l'impression. devrait résoudre votre problème.

Vous devriez également envisager de déplacer le code qui lit l’autre processus dans un thread. L’idée ici est que vous ne pouvez jamais savoir quand les données arriveront et utiliser un fil de discussion vous aide à comprendre ces problèmes tout en écrivant le code qui traite les résultats.

À cet endroit, je voulais vous montrer la nouvelle documentation Python 2.6, mais elle n’explique pas le problème de la couleur, à savoir :( Eh bien ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top