web-dev-qa-db-fra.com

Python sous-processus et interaction utilisateur

Je travaille sur une interface graphique en Python 2.6 et généralement c'est assez simple: vous utilisez subprocess.call() ou subprocess.Popen() pour émettre la commande et attendre pour qu'il se termine ou réagisse à une erreur. Que faire si vous avez un programme qui s'arrête et attend l'interaction de l'utilisateur? Par exemple, le programme peut s'arrêter et demander à l'utilisateur un ID et un mot de passe ou comment gérer une erreur?

c:\> parrot
Military Macaw - OK
Sun Conure - OK
African Grey - OK
Norwegian Blue - Customer complaint!
(r) he's Resting, (h) [Hit cage] he moved, (p) he's Pining for the fjords

Jusqu'à présent, tout ce que j'ai lu vous indique comment lire toutes les sorties d'un programme uniquement après c'est terminé, pas comment gérer les sorties pendant que le programme est toujours en cours d'exécution. Je ne peux pas installer de nouveaux modules (c'est pour un LiveCD) et je traiterai les entrées utilisateur plus d'une fois.

27
Dave Brunker

Consultez le manuel sous-processus . Vous avez des options avec subprocess pour pouvoir rediriger les stdin, stdout et stderr du processus que vous appelez par vous-même.

from subprocess import Popen, PIPE, STDOUT

p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

grep_stdout = p.communicate(input='one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print grep_stdout

Vous pouvez également interagir avec un processus ligne par ligne. Étant donné que prog.py:

import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()

Vous pouvez interagir avec elle ligne par ligne via:

>>> from subprocess import Popen, PIPE, STDOUT
>>> p = Popen(['python', 'prog.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> p.stdout.readline().rstrip()
'what is your name'
>>> p.communicate('mike')[0].rstrip()
'your name is mike'
28
Mike