2016-03-30 6 views
0

fabric.api.runでコマンドを実行すると、の出力をキャプチャするには、リモートサーバーで実行しているコマンドを使用しますか?fabric.api.runからの超過出力

システムbash_profileファイルの出力は、ファブリック出力によってもキャプチャされます。

この場合、どうすればよいかわかりません。

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... 

望ましくない出力は、上記の星印付きの行です。モジュールは管理者(この場合はslurm)によって自動的にロードされ、module loadコマンドの出力が、実行しようとしているコマンドの出力とともに表示されます。

output.stdoutを使用すると、出力は実際にはラッパークラスなので動作しません。これはすべて標準出力なので、まったく同じものを返します。

だから、この特定の問題を解決するアイデア、回避策のアイデアはありますか?だから、

おかげ

答えて

0

、私は当分の間使用する回避策を共有しましょう。他の誰かがそれをやる方法があれば、共有してください。

から:

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

へ:

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 
:ランダムな空白が出力に問題があると思われるので、

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] 

そして、

関連する問題