español - Subproceso Python e interacción con el usuario.
subprocess python 3 example (1)
Estoy trabajando en una interfaz gráfica de usuario en Python 2.6 y, por lo general, es bastante simple: utiliza subprocess.call()
o subprocess.Popen()
para emitir el comando y esperar a que finalice o reaccione ante un error. ¿Qué hace si tiene un programa que se detiene y espera la interacción del usuario? Por ejemplo, ¿el programa podría detenerse y pedirle al usuario una ID y contraseña o cómo manejar un error?
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
Hasta ahora, todo lo que he leído le dice cómo leer toda la salida de un programa solo después de que haya terminado, no cómo manejar la salida mientras el programa aún se está ejecutando. No puedo instalar nuevos módulos (esto es para un LiveCD) y trataré con las entradas del usuario más de una vez.
Echa un vistazo al manual de subprocess . Tiene opciones con subprocess
para poder redirigir el stdin
, stdout
y stderr
del proceso que está llamando a su propio.
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
También puede interactuar con un proceso línea por línea. Dado esto como prog.py
:
import sys
print ''what is your name?''
sys.stdout.flush()
name = raw_input()
print ''your name is '' + name
sys.stdout.flush()
Puedes interactuar con él línea por línea a través de:
>>> 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''