python - guia - qgis manual
Tela-¿Hay alguna forma de capturar la salida estándar? (6)
Estoy tratando de hacer lo siguiente:
output = run("ls -l backups")
for line in output.split("/n"):
do_stuff(line)
¿Alguna forma de tener el stdout
de ls
enviado a la output
?
Para ser más específico, estoy usando una aplicación CLI llamada s3cmd
que hace algo similar a ls
, pero con s3cmd
remotos de Amazon S3.
Así que un reemplazo para ls
no ayudará desafortunadamente.
En caso de que necesite usar run (), puede hacerlo así:
with settings(
hide(''warnings'', ''running'', ''stdout'', ''stderr''),
warn_only=True
):
command = ''ls -l backups''
output = run(command)
for line in output.splitlines():
do_stuff(line)
Para local () hay una solución un poco más simple:
command = ''ls -l backups''
output = local(command, capture=True)
for line in output.splitlines():
do_stuff(line)
Espero que ayude.
Exactamente lo que estás pidiendo debería estar sucediendo. De la docs :
run devolverá el resultado de la salida estándar del programa remoto como una cadena única (probablemente multilínea).
run()
, y comandos relacionados como local()
y sudo()
, devuelven un objeto _AttributeString
que es solo un envoltorio alrededor de stdout con acceso de atributo a información adicional como booleanos de fallo / éxito, stderr, el comando ejecutar, etc. El objeto de resultado También tiene un atributo stdout
, que es más explícito.
Para solucionar los problemas, print type(output), output
para asegurarse de que la respuesta sea la esperada. Examine output.failed
y output.stderr
. Puede ser que el comando no haga lo que usted espera, no hay un directorio de "copias de seguridad", etc.
Intenta dividir usando " /r/n
":
output = run("ls -l backups")
output_stdout = output.stdout.split("/r/n")
Intente lo siguiente usando String IO
from fabric.api import *
from StringIO import StringIO
fh = StringIO()
run("ls -l backups", stdout=fh)
for line in fh.readlines():
do_stuff(line)
Simplemente devuélvalo:
def output():
return run("ls -l backups")
a = execute(output, host=hostname)
print a
Será un diccionario de resultados.
También puede usar esto si está usando la API local()
, configurando la capture=True
@task
def login_ecr_docker():
ecr_login = local("aws ecr get-login --region us-west-2", capture=True)
docker_login = ecr_login.stdout
status = local(docker_login, capture=True)
print (status.stdout)