Foros del Web » Programando para Internet » Python »

subprocess

Estas en el tema de subprocess en el foro de Python en Foros del Web. Bueno, el asunto es el siguiente... Tengo una aplicacion que corre sobre terminal, y queria poder ejecutar un proceso de esa aplicacion desde una que ...
  #1 (permalink)  
Antiguo 01/01/2010, 13:41
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
De acuerdo subprocess

Bueno, el asunto es el siguiente...

Tengo una aplicacion que corre sobre terminal, y queria poder ejecutar un proceso de esa aplicacion desde una que estoy haciendo en python

estuve horas renegando con el modulo subprocess, me recorri varios lugares y no logro hacerlo andar..

El problema es que , el programa que quiero correr no realiza su tarea y termina, sino que hace algunas preguntas de esta forma

Ejecuto: el programa y el argumento "-C"
$ programa -C

y el programa me devuelve un texto, el cual yo quiero recojer, y luego a ese texto tengo que contestar con 1 o 0 y presionar enter, y luego de eso, me hace otra pregunta, y tengo que escribir otro dato!...

BUeno, el tema es como emular eso, como controlarlo, porque no he podido lograrlo! :(

He iniciado el proceso de esta forma

proc = subprocess.Popen(["-C"], shell=False, executable="/usr/local/bin/np2", stdin=subprocess.PIPE)

y luego he usado el metodo communicate para que me devuelva el texto de salida del programa y he intentado usarlo para enviarle los datos que necesita, pero no me ha funcionado!

Si alguien sabe

Gracias!
  #2 (permalink)  
Antiguo 01/01/2010, 14:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: subprocess

Si entendí bien, lo que tratas de hacer es un:
$ programa1 | programa2

Donde el programa1 manda datos por el stdout, mientras que el programa2 a su vez lee los datos del stdout.

Bueno eso es lo que entendí.
  #3 (permalink)  
Antiguo 01/01/2010, 14:24
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: subprocess

mm lo que realmente quiero es automatizar una configuracion!....

Veamos mas claro!

1- Ejecuto el programa en terminal (TODO A MANO)
Código bash:
Ver original
  1. $ np2 -C
2- El programa devuelve a esa llamada un texto similar al siguiente (Para no andar copiando todo)
Código bash:
Ver original
  1. Seleccione de las siguientes opciones
  2. 0 Opcion alguna
  3. 1 Opcion otra

Y deja el cursor titilando en espera de uno ingrese un 0 o un 1 y presione ENTER

Para luego devolver otro texto, preguntando direccion de correo..
Para lo cual otra vez deja titilando el cursor en espera de que se tipee la direccion de correo y se presione ENTER...

Este proceso sucede unas 5 veces, para configurar el programa!..

Yo lo que quiero es poder ir capturando esas salidas, para mostrarlas en un log, y poder ir respondiendo a las mismas! pero de fondo, sin que el usuario tenga que hacerlo a mano!...

Poder hacer que mi programa le diga 0 o 1, direccion de correo, etc!

Se comprende?
  #4 (permalink)  
Antiguo 01/01/2010, 15:56
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: subprocess

Código Python:
Ver original
  1. #programa1.py
  2. f = open("log.txt", "w")
  3. f.write(raw_input("Selecciona 1 | 0\n") + "\n")
  4. f.write(raw_input("correo\n") + "\n")
  5. f.write(raw_input("otro dato\n") + "\n")
  6. f.close()
Este programa simula a np2

Código Python:
Ver original
  1. from subprocess import Popen, PIPE
  2.  
  3. p = Popen(["python programa1.py", "-C"], shell=True, stdin=PIPE, stdout=PIPE, close_fds=True)
  4. (child_stdin, child_stdout) = (p.stdin, p.stdout)
  5. #Aqui vamos poniendo los datos
  6. child_stdin.write("0\n")
  7. child_stdin.write("correo\n")
  8. child_stdin.write("otros datos\n")
  9. p.wait()
Este otro llena los datos de programa1.py
Nota: para np2, el Popen quedaria algo asi:
Código Python:
Ver original
  1. p = Popen(["np2", "-C"], stdin=PIPE, stdout=PIPE, close_fds=True)
Espero que sea lo que estés buscando.
  #5 (permalink)  
Antiguo 01/01/2010, 16:42
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: subprocess

Perfecto, ahora me gustaria entender algunas cosas!, por lo que estuve leyendo, stdin es la entrada estandar (por ejemplo cuando tecleo en el teclado, y el stdout es la salida estandar de cualquier programa, el strer es la salida de error!
Ahora bien... cuando haces esto:
(child_stdin, child_stdout) = (p.stdin, p.stdout)
estas transfiriendo a la variable child_stdin una especie de "handler" del stdin correspondiente al proceso???
y lo mismo para el stdout???

Otra cosa

p.wait() cual es el sentido de la espera???

Para que sirve close_fds en True??


PIPE?? leyendo la documentacion no logre captar bien que es lo que significa o que funcion realiza aqui! y por que se asigna en los argumentos stdin, y stdout


Tambien algo que me representa una gran duda con respecto a que he programado otros lenguajes y no lo he visto asi.... pero, en la documentacion de la clase Fopen, aparecen toda la lista de argumentos posibles, en un orden de "declaracion"
Por que al establecer los valores para shell, para close fds, etc, se escribe tambien el nombre del argumento???
(Python soporta poner argumentos en cualquier orden? si los utilizamos de esta forma??


Y por ultimo.... los write! los pusiste todos seguidos!.... No seria

UNA SALIDA, UN WRITE
UNA SALIDA, UN WRITE
UNA SALIDA, UN WRITE

Lo digo porque necesitaria conocer el valor de algunas slaidas del programa para poder parsearlo y dar una respuesta! :)


Muchiimas gracias por todo!
  #6 (permalink)  
Antiguo 01/01/2010, 17:18
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: subprocess

Cita:
Iniciado por korg1988
Ahora bien... cuando haces esto:
(child_stdin, child_stdout) = (p.stdin, p.stdout)
estas transfiriendo a la variable child_stdin una especie de "handler" del stdin correspondiente al proceso???
y lo mismo para el stdout???
Lo único que hago, es al p.stind le doy el nombre de child_stdin lo mismo con p.stdout. En realidad no hago nada especial, solo le doy otro nombre.

Cita:
Iniciado por korg1988
p.wait() cual es el sentido de la espera???
En mi programa de prueba, terminaba de dar los datos y terminaba antes que el otro programa terminara de escribir en el archivo, por eso el wait.


Cita:
Iniciado por korg1988
Para que sirve close_fds en True??
Para que cierre, los archivos stdin, stout y stderr al finalizar el programa. Recuerda todo es un archivo.

Cita:
Iniciado por korg1988
PIPE?? leyendo la documentación no logre captar bien que es lo que significa o que funcion realiza aqui! y por que se asigna en los argumentos stdin, y stdout
PIPE es un valor, que le indica a la función que vamos a trabajar con stdin, stdout o stderr. De ese proceso. En vez de PIPE tambien podemos usar el stdout de otro proceso como stdin de otro. Ejemplo

Cita:
Iniciado por korg1988
Tambien algo que me representa una gran duda con respecto a que he programado otros lenguajes y no lo he visto asi.... pero, en la documentacion de la clase Fopen, aparecen toda la lista de argumentos posibles, en un orden de "declaracion"
Por que al establecer los valores para shell, para close fds, etc, se escribe tambien el nombre del argumento???
(Python soporta poner argumentos en cualquier orden? si los utilizamos de esta forma??
Así es los argumentos que son opcionales, pueden ir de cualquier forma. El orden no afecta el resultado (Propiedad asociativa).

Cita:
Iniciado por korg1988
Y por ultimo.... los write! los pusiste todos seguidos!.... No seria

UNA SALIDA, UN WRITE
UNA SALIDA, UN WRITE
UNA SALIDA, UN WRITE
Esto no le entendí muy bien, pero puedes ponerlos como tu gustes. Por ejemplo:
write("0\ncorreo\notrodato\n")
o
write("dato\n")
#mas código
write("otro dato\n")
  #7 (permalink)  
Antiguo 01/01/2010, 17:25
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: subprocess

A lo que voy con mi ultimo punto es a lo siguiente...

A medida que le envio algo a al programa, quisiera poder leer la respuesta que el me da con respecto a lo previo enviado por mi (No se si soy claro)

intente usar
print p.stdout.read()

pero no hubo caso!!

Hasta ahora voy entendiendo el resto
  #8 (permalink)  
Antiguo 01/01/2010, 19:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: subprocess

Yo no pude pero al parecer es posible

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:37.