versiones guia español python fabric

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)