2016-03-30 9 views
0

Beim Ausführen eines Befehls über fabric.api.run, wie erhalte ich die Ausgabe von nur den Befehl, den ich auf dem Remote-Server ausgeführt habe?Überschüssige Ausgabe von fabric.api.run

Alle Ausgaben, die aus der Datei bash_profile des Systems resultieren, werden ebenfalls von der Fabric-Ausgabe erfasst.

Nicht genau, was in diesem Fall zu tun ist.

from fabric.api import env, run 
env.host_string = "hostname" 

def run_a_thing(): 
    output = run("find /some/files/somewhere") 
    return output 

the_files_I_want = run_a_thing() 

the_files_I_want 

[hostname] run: find /some/files/somewhere 
**[hostname] out: Module slurm/15.08.1 loaded** 
**[hostname] out:** 
[hostname] out: file1... 
[hostname] out: file2... 

Die unerwünschte Ausgabe ist die markierten Zeilen oben. Die Module werden automatisch von den Administratoren geladen (in diesem Fall slurm), und die Ausgabe des Modulladebefehls erscheint mit der Ausgabe des Befehls, den ich auszuführen versuche.

Mit output.stdout, da Ausgabe ist eigentlich eine Wrapper-Klasse, funktioniert nicht. Es gibt genau dasselbe zurück, da dies alles stdout ist.

Also, Ideen, dieses spezifische Problem zu beheben, Ideen für eine Problemumgehung? So

Dank

Antwort

0

, werde ich die Abhilfe teilen, die ich für den Augenblick verwendet. Wenn jemand eine andere Möglichkeit hat, es zu tun, bitte teilen.

Von:

def do_thing(path): 
    command = "find {}".format(path) 
    return run(command).stdout.splitlines() 

An:

def do_thing(path): 
    command = "find {}".format(path) 
    background = run("").stdout.splitlines() 
    output = run(command).stdout.splitlines() 
    return [x for x in output if x not in background] 

Und da zufällig Leerzeichen ein Problem mit dem Ausgang zu sein scheint:

def do_thing(path): 
    command = "find {}".format(path) 
    background = run("").stdout.splitlines() 
    output = run(command).stdout.splitlines() 
    desired_output = [] 

    for line in output: 
     for unwanted_line in background: 
      if not re.search(unwanted_line.strip(), line): 
       desired_output += [line] 

    return desired_output