2012-02-17 9 views
8

Si engendro un nuevo subprocess en python con un comando dado (supongamos que comienzo el intérprete de python con el comando python), ¿cómo puedo enviar datos nuevos al proceso (a través de STDIN)?¿Mantiene vivo un subproceso y sigue dándole comandos? Python

+1

si se trata de una concha desea automatizar la interacción con, 'pexpect' es ideal para este tipo de cosas. – wim

Respuesta

8

Utilice el módulo estándar subprocess. Utiliza subprocess.Popen() para iniciar el proceso, y se ejecutará en segundo plano (es decir, al mismo tiempo que su programa Python). Cuando llame a Popen(), probablemente desee establecer los parámetros stdin, stdout y stderr para subprocesar.PIPE. Luego puede usar los campos stdin, stdout y stderr en el objeto devuelto para escribir y leer datos.

No comprobado código de ejemplo:

from subprocess import Popen, PIPE 

# Run "cat", which is a simple Linux program that prints it's input. 
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE) 
process.stdin.write(b'Hello\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'Hello\n' 
process.stdin.write(b'World\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'World\n' 

# "cat" will exit when you close stdin. (Not all programs do this!) 
process.stdin.close() 
print('Waiting for cat to exit') 
process.wait() 
print('cat finished with return code %d' % process.returncode) 
+0

Digamos que necesito varios procesos ejecutándose a la vez. ¿Es una mejor idea generar muchos subprocesos con 'Popen()', o con 'fork'? – n0pe

+1

Popen hace fork los procesos. Solo se trata de si desea realizar el fork de nivel bajo usted mismo o si lo desea envuelto en una biblioteca de nivel superior. El resultado final es exactamente el mismo. –

+0

¿Entonces varios Popens concurrentes no empantanarán el sistema? Gracias, intentaré esto. – n0pe

0

Un túnel creado por Subprocess para disparar varios comandos no se puede mantener activo. para lograr esto puedes mirar paramiko, para otras cosas como subproceso stdin, stdout, stderr puedes ir a través de este enlace python subprocess, ya que este es tu primer proyecto python es mejor que leas y pruebes cosas.

3

No.

Si desea enviar comandos a un subproceso, cree un pty y luego bifurque el subproceso con un extremo de la unidad adjunta a su STDIN.

Aquí hay un fragmento de algunos de mi código:

RNULL = open('/dev/null', 'r') 
WNULL = open('/dev/null', 'w') 

master, slave = pty.openpty() 
print parsedCmd 
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL, 
         stdout=WNULL, stderr=slave) 

En este código, el PTY está unido a stderr porque recibe mensajes de error en lugar de envío de comandos, pero el principio es el mismo.

+1

No use pty.openpty() con subproceso, eso es demasiado complejo. Utilice el subproceso.PIPE y deje que el módulo de subproceso se encargue de ello. (Además de ser más simple y más estándar, usará una tubería, que es más liviana que un PTY). – user9876

Cuestiones relacionadas