_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
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/
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ó:
-------------------------------------------------------
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
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
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.
Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/
Featured article:
Nabble - Trac Users - Embedding pages? -
http://feedproxy.google.com/~r/TracGViz-full/~3/MWT7MJBi08w/Embedding-pages--td27358804.html
> ¿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
> 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
> 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.
;-)
¡Perfecto! Justo lo que necesitaba, y no era consciente del módulo 'shlex'.
Gràcies Arnau!
--
##############################
### Jordi Funollet
### http://www.terraquis.net