2014-01-29 10 views
23

Ich versuche, die folgendes zu tun:Fabric - Gibt es eine Möglichkeit, RunStdout zu erfassen?

output = run("ls -l backups") 
for line in output.split("/n"): 
    do_stuff(line) 

Jede Art und Weise der mit der stdout von ls geschickt output?


Um genauer zu sein, ich bin ein CLI App s3cmd genannt, die etwas ähnliches wie ls tut, aber mit entfernten Eimer Amazon S3.

So ein Ersatz für ls wird leider nicht helfen.


Antwort

21

Genau das, was Sie fordern, sollte passieren. Von der docs:

run wird das Ergebnis der Stdout des Remote-Programms als eine einzelne (wahrscheinlich mehrzeilige) Zeichenfolge zurückgeben.

run() und ähnliche Befehle wie local() und sudo(), geben ein _AttributeString Objekt, das mit dem Attribut Zugriff auf zusätzliche Informationen wie Ausfall/Erfolg booleans, stderr, den Befehl ausführen, usw. Das Ergebnis Objekt nur ein Wrapper um stdout hat auch ein stdout Attribut, das nur expliziter ist.

Zur Fehlerbehebung, print type(output), output, um sicher zu sein, die Antwort ist, was Sie erwarten. Untersuchen Sie output.failed und output.stderr. Es könnte der Befehl nicht zu tun, was Sie erwarten, gibt es keine „Sicherungen“ Verzeichnis usw.

+0

'... output = laufen (cmd) print 'Befehlsausgabe: {}'. format (output.stdout) ... ' – kip2

14

Versuchen, wie unten mit 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) 
+4

Sie könnten' fh.seek (0) 'vergessen. – hbrls

+0

Wenn ich dies tue bekomme ich einen leeren Inhalt in "Zeile" –

+9

zu komplex, verwenden Sie einfach '' myvar = run ("mycommand") '' – RichVel

6

Falls Sie benötigen Lauf() zu verwenden, Sie können es wie folgt tun:

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) 

Für die lokale() gibt ein bisschen mehr einfache Lösung ist:

command = 'ls -l backups' 
output = local(command, capture=True) 
for line in output.splitlines(): 
    do_stuff(line) 

ich hoffe, es hilft.

0

Einfach nur zurückgeben:

def output(): 
    return run("ls -l backups") 
a = execute(output, host=hostname) 
print a 

ein Wörterbuch der Ergebnisse sein.

2

Try Split mit "\r\n":

output = run("ls -l backups") 
output_stdout = output.stdout.split("\r\n") 
4

Sie können dies auch nutzen, wenn Sie die local() api verwenden, indem Sie den 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) 
Verwandte Themen