[Python-es] Subprocess imprimir salida en pantalla en un archivo

653 views
Skip to first unread message

Gabriel Rech

unread,
Feb 10, 2010, 11:57:13 AM2/10/10
to La lista de python en castellano
Hola a todos!
Estoy corriendo desde Python, un programa que se corre normalmente desde terminal de linux.
Para esto estoy usando el modulo subprocess. Basicamente lo que tengo es esto...

subprocess.call(process, shell = True)

Esto funciona bien. Ahora, el asunto es que me gustaría que mi script guardara la salida que el programa produce y muestra en pantalla, en un archivo.
Es posible esto?

Desde ya, muchas gracias

Gabriel

José Luis Torre Hernández

unread,
Feb 10, 2010, 12:04:39 PM2/10/10
to La lista de python en castellano
Hola Gabriel:
 
Puedes hacer lo siguiente (aunque no lo he probado):
 
subprocess.call("ls -lR > /tmp/listado", shell =True)
 
Aunque no recuerdo para qué era la opción shell=True
 
Saludos
José Luis Torre


 
_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Olemis Lang (Simelix)

unread,
Feb 10, 2010, 12:15:12 PM2/10/10
to JoseLuisTor...@gmail.com, La lista de python en castellano
> El 10 de febrero de 2010 17:57, Gabriel Rech <rec...@gmail.com> escribió:
>>
>> Hola a todos!
>> Estoy corriendo desde Python, un programa que se corre normalmente desde
>> terminal de linux.
>> Para esto estoy usando el modulo subprocess. Basicamente lo que tengo es
>> esto...
>>
>> subprocess.call(process, shell = True)
>>
>> Esto funciona bien. Ahora, el asunto es que me gustaría que mi script
>> guardara la salida que el programa produce y muestra en pantalla, en un
>> archivo.
>> Es posible esto?
>>
>> Desde ya, muchas gracias
>>
>> Gabriel
>>
>
2010/2/10 José Luis Torre Hernández <joseluistor...@gmail.com>:

> Hola Gabriel:
>
> Puedes hacer lo siguiente (aunque no lo he probado):
>
> subprocess.call("ls -lR > /tmp/listado", shell =True)
>

Hay un parámetro para esto (AFAICR stdin). Allí se pasa un fichero
abierto con 'wb' (AFAICR)

> Aunque no recuerdo para qué era la opción shell=True
>

para no tener q pasar una lista
;o)

--
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Free milestone ranch Download - mac software -
http://feedproxy.google.com/~r/TracGViz-full/~3/rX6_RmRWThE/

Javier Collado

unread,
Feb 10, 2010, 12:20:33 PM2/10/10
to La lista de python en castellano
Hola,

Lo que yo haría sería capturar la salida del comando:
salida = subprocess.Popen('ls', stdout=subprocess.PIPE).communicate()[0]

una vez que se ha obtenido la salida, se puede imprimir y/o guardar en
un fichero según se desee (las dos cosas a la vez se pueden hacer si
se utiliza logging y se configura adecuadamente).

Si quieres capturar toda la salida (incluida la de error), entonces
habría que añadir stderr=subprocess.STDOUT

Un saludo,
Javier

P.D. 'shell = True' sirve para pasar el comando a través de una shell
para expandir variables, parsear los argumentos, etc.

El día 10 de febrero de 2010 18:04, José Luis Torre Hernández
<joseluistor...@gmail.com> escribió:

Jordi Funollet

unread,
Feb 10, 2010, 12:46:06 PM2/10/10
to La lista de python en castellano
Yo uso esta funcioón para llamar a subprocess:

-------------------------------------------------------
def oneliner(cmd, stdin=None):
"""Execs the string in a shell. Returns cmd output.

@cmd: string with the command to be executed
@stdin: (optional) string writen to the command's standard input
"""
pipe = subprocess.Popen(cmd.split(), stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
ret = pipe.communicate(stdin)

if pipe.returncode == 0:
return ret[0]
else:
return None
-------------------------------------------------------

Por ejemplo,

host = oneliner("hostname -f")

Ahora todo se reduce a salvar la variable 'host' en un fichero de texto; no
debería darte muchos problemas.

--
##############################
### Jordi Funollet
### http://www.terraquis.net

Javier Collado

unread,
Feb 10, 2010, 1:15:20 PM2/10/10
to La lista de python en castellano
Hola,

La función oneliner tiene buena pinta. Sólo un comentario: hay que
tener cuidado cuando se pasen comandos con argumentos entrecomillados
que contengan espacios porque entonces cmd.split() no los separa bien.

Un saludo,
Javier

Jordi Funollet

unread,
Feb 10, 2010, 1:19:38 PM2/10/10
to La lista de python en castellano
On Wednesday 10 February 2010 19:15:20 Javier Collado wrote:
> Hola,
>
> La función oneliner tiene buena pinta. Sólo un comentario: hay que
> tener cuidado cuando se pasen comandos con argumentos entrecomillados
> que contengan espacios porque entonces cmd.split() no los separa bien.

Tienes toda la razón, Javier.

¿Alguien tiene alguna sugerencia para resolverlo de forma pythonica? Lo que se
me ocurre a mí ocuparía el triple de líneas de código.

Olemis Lang (Simelix)

unread,
Feb 10, 2010, 1:37:48 PM2/10/10
to La lista de python en castellano
2010/2/10 Jordi Funollet <jor...@ati.es>:

> On Wednesday 10 February 2010 19:15:20 Javier Collado wrote:
>> Hola,
>>
>> La función oneliner tiene buena pinta. Sólo un comentario: hay que
>> tener cuidado cuando se pasen comandos con argumentos entrecomillados
>> que contengan espacios porque entonces cmd.split() no los separa bien.
>
> Tienes toda la razón, Javier.
>
> ¿Alguien tiene alguna sugerencia para resolverlo de forma pythonica? Lo que se
> me ocurre a mí ocuparía el triple de líneas de código.

Para eso es el parámetro shell, no? Si se le dice shell=True entonces
solo hay que especificar la línea de comandos sin preocuparse en
separarla (CMIIW ;o).

--
Regards,

Olemis.

Featured article:
Nabble - Trac Users - Embedding pages? -
http://feedproxy.google.com/~r/TracGViz-full/~3/MWT7MJBi08w/Embedding-pages--td27358804.html

Arnau Sanchez

unread,
Feb 10, 2010, 1:53:15 PM2/10/10
to La lista de python en castellano
On 10/02/10 19:19, Jordi Funollet wrote:

> ¿Alguien tiene alguna sugerencia para resolverlo de forma pythonica? Lo que se
> me ocurre a mí ocuparía el triple de líneas de código.

Yo no veo nada malo en que el argumento comando sea una lista/tupla (de hecho
cuando construyes el comando, ésta es una forma muy cómoda de poner los
argumentos, ya que muchos suelen ser variables).

Pero una forma fácil de permitir una cadena es usar shlex.split():

command = 'ls "un fichero con espacios" otro2 otro3'
subprocess.Popen(shlex.split(command), ...)

---

Y ya que estamos enseñándonos los wrappers, éste es el que uso cuando necesito
algo versátil (stdin + retcode/stdout/stderr):

def run(command, inputdata=None, **kwargs):
default_kwargs = dict(stdout=subprocess.PIPE, stderr=subprocess.PIPE)
popen = subprocess.Popen(command, **dict(default_kwargs, **kwargs))
outputdata, errdata = popen.communicate(inputdata)
return popen.returncode, outputdata, errdata

print run(["ls", "-al", "/etc/services", "djkdkfjdf"])

--
Desarrollador freelance
http://www.arnau-sanchez.com

Arnau Sanchez

unread,
Feb 10, 2010, 2:02:26 PM2/10/10
to La lista de python en castellano
On 10/02/10 19:37, Olemis Lang (Simelix) wrote:

> Para eso es el parámetro shell, no? Si se le dice shell=True entonces
> solo hay que especificar la línea de comandos sin preocuparse en
> separarla (CMIIW ;o).

Los guardianes de la ortodoxia se llevarán las manos a la cabeza si lanzas una
shell (que se agencia su buen pedazito de memoria) cuando de hecho no la
necesitas para ejecutar el comando (y más aún si sólo lo haces por comodidad).

;-)

--
Desarrollador freelance
http://www.arnau-sanchez.com

Hernan Foffani

unread,
Feb 10, 2010, 5:25:45 PM2/10/10
to La lista de python en castellano

El 10/02/2010, a las 20:02, Arnau Sanchez escribió:

> On 10/02/10 19:37, Olemis Lang (Simelix) wrote:
>
>> Para eso es el parámetro shell, no? Si se le dice shell=True entonces
>> solo hay que especificar la línea de comandos sin preocuparse en
>> separarla (CMIIW ;o).
>
> Los guardianes de la ortodoxia se llevarán las manos a la cabeza si lanzas una shell (que se agencia su buen pedazito de memoria) cuando de hecho no la necesitas para ejecutar el comando (y más aún si sólo lo haces por comodidad).
>
> ;-)

¡Vaya con los Guardianes! Espero que doña Ortodoxia no esté sobrecogida ante el entusiasmo de sus adláteres.

Supongo que tendrá que ver con la edad pero tengo que confesar que ante un problema con varias soluciones la comodidad--sobre todo la mía--suele decidir en un gran porcentaje de las veces.

;-)

Jordi Funollet

unread,
Feb 11, 2010, 10:29:59 AM2/11/10
to La lista de python en castellano
On Wednesday 10 February 2010 19:53:15 Arnau Sanchez wrote:
> Pero una forma fácil de permitir una cadena es usar shlex.split():

¡Perfecto! Justo lo que necesitaba, y no era consciente del módulo 'shlex'.

Gràcies Arnau!


--
##############################
### Jordi Funollet
### http://www.terraquis.net

Reply all
Reply to author
Forward
0 new messages