Foros del Web » Programando para Internet » Python »

output de subprocess.Popen()

Estas en el tema de output de subprocess.Popen() en el foro de Python en Foros del Web. Hola, Mi problemas es el siguiente, quiero obtener la salida de un comando y ponerla en un objeto file con la funcion Popen() del modulo ...
  #1 (permalink)  
Antiguo 24/02/2010, 22:10
 
Fecha de Ingreso: enero-2008
Ubicación: Chaco
Mensajes: 116
Antigüedad: 11 años, 7 meses
Puntos: 0
output de subprocess.Popen()

Hola,

Mi problemas es el siguiente, quiero obtener la salida de un comando y ponerla en un objeto file con la funcion Popen() del modulo subprocess. Bueno, en teoria se haria de esta manera...

Código:
>>> import subprocess, tempfile
>>> tmpout = tempfile.NamedTemporaryFile(mode='w+');
>>> ppn = subprocess.Popen("dir", stdout=tmpout, stderr=subprocess.STDOUT, shell=True);
>>> tmpout.read()
'' # Por que no sale nada???
>>>
y si en vez de usar un objeto file como parametro stdout utilizo el subprocess.PIPE la salida sale perfectamente...

Código:
>>> import subprocess
>>> ppn = subprocess.Popen("dir", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True);
>>> ppn.stdout.read()
' El volumen de la unidad C no tiene etiqueta.\r\n El n\xa3mero de serie del volumen es blablabla...'
>>>
si saben por que me ayudan..

Gracias
Salu2
__________________
La web es ciencia xD www.resiscity.com.ar, http://www.leoferreyra.com.ar
  #2 (permalink)  
Antiguo 25/02/2010, 11:16
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: output de subprocess.Popen()

Haciendo algunas pruebas creo que descubrí el problema: estás abriendo el archivo temporal para escritura, no para lectura. Por eso read() devuelve una cadena vacía.

Deberías cerrar el archivo y abrirlo de nuevo para lectura.


saludos.
  #3 (permalink)  
Antiguo 25/02/2010, 11:31
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 5 meses
Puntos: 1360
Respuesta: output de subprocess.Popen()

Debo aclarar varios puntos:
Código:
>>> tmpout = tempfile.NamedTemporaryFile(mode='w+'); #No termina con punto y coma
Ahora subprocess.(STDOUT | STDIN | STDERR | PIPE) son flags en otras palabras no son las que enteros.

Código:
ppn.stdout.read()
Usa ppn.communicate() en su lugar.


Ejemplo:
Código:
from subprocess import STDOUT, PIPE, Popen
from tempfile import NamedTemporaryFile

command = "ls"
tmpout = NamedTemporaryFile(mode='w+')
p = Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
pstdout, pstderr = p.communicate()
tmpout.write(pstdout)
tmpout.seek(0) #Regresamos al principio del archivo
tmpout.read()
  #4 (permalink)  
Antiguo 25/02/2010, 20:21
 
Fecha de Ingreso: enero-2008
Ubicación: Chaco
Mensajes: 116
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: output de subprocess.Popen()

@AlvaroG el '+' significa modo de lectura/escritura simultaneos.

@razpeitia el ';' puede ir o no indistintamente, pero es una buena practica hacerlo. No es lo mismo subprocess.STDOUT y subprocess.stdout, el que va con mayusculas es la constante, el otro es un objeto file que se utiliza con el valor subprocess.PIPE en el parametro stdout. Ya conocia el cómo utilizar subprocess.comunicate(), solo queria saber por que no obtengo los resultados cuando le paso un objeto file-like al parametro stdout.

Si alguien sabe por que no funciona me avisa ;)
Gracias por sus respuestas..
Salu2
Salu2
__________________
La web es ciencia xD www.resiscity.com.ar, http://www.leoferreyra.com.ar
  #5 (permalink)  
Antiguo 25/02/2010, 21:39
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: output de subprocess.Popen()

Tienes razón, se me escapó ese detalle y no es esa la explicación, aunque ya me di cuenta de la verdadera causa.
El asunto es que el puntero interno del archivo apunta al final de lo último que se escribió, y por lo tanto read() no devuelve nada. El contenido está ahí, usa seek(0) para volver el apuntador al principio del archivo y poder leer.

En cuanto al punto y coma, supongo que es cuestión de gustos, pero no es el estilo Python utilizar cosas superfluas, la simplicidad es una de las máximas.


Saludos.
  #6 (permalink)  
Antiguo 26/02/2010, 02:30
 
Fecha de Ingreso: enero-2008
Ubicación: Chaco
Mensajes: 116
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: output de subprocess.Popen()

Solucionado! si, era eso alvaroG era llevar el puntero otra vez al comienzo xD.. gracias...

lo de el ; es cierto, es cuestion de gustos... ademas como que ensucia un poco la simplicidad del code python xD jajaja lo que pasa es que si uno utiliza varios lenguajes como javascript, C++ etc.. es obligatorio el ; xD

Muchas gracias...
Salu2
__________________
La web es ciencia xD www.resiscity.com.ar, http://www.leoferreyra.com.ar

Etiquetas: output
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 09:21.