Comment interagir avec un processus à l'aide de sous-processus module
Je vais avoir des problèmes de redirection stdio d'un autre programme à l'aide de sous-processus module. Il suffit de lire à partir de stdout résultats dans la pendaison, et Popen.communiquer() fonctionne, mais il ferme les tubes après la lecture/écriture. Quelle est la meilleure façon de mettre en œuvre cette?
Je jouais un peu avec ce 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
Dupliquer: stackoverflow.com/questions/163542/..., stackoverflow.com/questions/295459/...
-u
pavillon résoudre pour un Python sous-processus. Il y a aussi pexpect
, pty
les modules et les unbuffer
, stdbuf
, script
utilitaires qui peuvent aider à résoudre le bloc-mise en mémoire tampon d'émission.
OriginalL'auteur Ivan Baldin | 2009-01-14
Vous devez vous connecter pour publier un commentaire.
Ne convient pas à 100% à votre exemple, mais aide à comprendre le problème sous-jacent: Processus P commence enfant C. Enfant C écrit quelque chose de sa sortie standard (stdout). la sortie standard de C est un tuyau qui a 4096 tampon de caractères et la sortie est plus courte que cela. Maintenant, C attend pour une entrée. Pour le C, tout va bien.
P attend la sortie, ce qui n'arrivera jamais parce que l'OS ne voit aucune raison de vider le tampon de sortie de C (avec si peu de données). Puisque P n'est jamais sortie de C, il ne sera jamais écrire quoi que ce soit à C, donc C se bloque en attente pour l'entrée à partir de P.
Correctif: l'Utilisation rincer après chaque écriture à un tuyau de forcer le système d'exploitation pour envoyer les données maintenant.
Dans votre cas, l'ajout de
proc.stdin.flush()
dans la principale de la boucle while et unsys.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 les autres processus dans un thread. L'idée ici est que vous ne pouvez jamais savoir quand les données seront disponibles et à l'aide d'un fil vous aide à comprendre ces questions pendant que vous écrivez le code qui traite les résultats.
À cet endroit, je voulais vous montrer la nouvelle version 2.6 de Python de la documentation, mais elle n'explique pas la chasse d'eau, soit 🙁 eh bien ...
pexpect
docs: Q: Pourquoi ne pas utiliser un tuyau (popen())?Pexpect docs a déménagé: voici lien
OriginalL'auteur Aaron Digulla