2016-05-14 5 views
2

私はPythonのファブリックを使用して、sshを使用してリモートホスト上でいくつかのタスクを実行しています。
タスクの1つは、サブタスクの進行状況バーを表示するときに、出力にキャリッジリターン文字を使用します。これに似た何か:Pythonのファブリックのキャリッジリターン( r)文字の処理

int main(int argc, char* argv[]) { 

     int i; 

     for (i = 0; i <= 5; ++i) { 
       printf("\rProgress: %d%%", (int)(100 * ((float)i/5))); 
       fflush(stdout); 
       sleep(1); 
     } 
     printf("\n"); 

     return 0; 
} 

これはPythonの生地を使用して実行されます:

def some_task(): 
    with settings(user = 'root'): 
     run('./task_with_progress_bar.out') 

tasks.execute(some_task, hosts = ['server_name']) 

ファブリック\rを無視し、代わりに1行でプログレスバーを持つのだろう、私は何を買ってあげることです。

[server_name] Executing task 'some_task' 
[server_name] run: ./task_with_progress_bar.out 
[server_name] out: 
[server_name] out: Progress: 0% 
[server_name] out: Progress: 20% 
[server_name] out: Progress: 40% 
[server_name] out: Progress: 60% 
[server_name] out: Progress: 80% 
[server_name] out: Progress: 100% 
[server_name] out: 

\r\n ...

として扱われているように思え210

上記の例はそれほど悪くはありませんが、私が実際に実行している作業はプログレスバーで満たされており、小さなステップで進行し、コンソール全体が不必要な出力で汚染されます。

Fabricが\rを無視しないように出力をカスタマイズする方法はありますか?同じ一般的な形式のままにしてください。[<server_name>] <action_being_taken>?私はこの形式が好きです、それはきれいできれいです。

+0

のあなたが特定の値でのみ更新するプログレスバーの出力を抑制することができfalseの場合、すなわち間隔を使用すると、進行状況の出力ではなく、他の出力を抑制したいですか? – malbarbo

+0

いいえ出力を抑止しません。私はそれでも '[server_name] という形式で表示させたいだけです。プログレスバーは複数の行には出力されません。私はそれが進行を示す1つの行に印刷されたい... –

答えて

2

問題は、ファブリックが\r\nに変換していることです。

この問題を回避するには、クラスのようなファイルを作成し、runstdout引数として渡すことですので、我々はと呼ばれるプログラムによって生成された出力を処理し、\rに戻っ\nを翻訳することができます。そのようなクラスを書くことの挑戦は\n\rに翻訳しなければならないことを特定することです。

class FixProgress: 
    def __init__(self): 
     self.saw_progress = False 

    def write(self, s): 
     if 'Progress:' in s: 
      self.saw_progress = True 
     if s == '\n' and self.saw_progress: 
      sys.stdout.write('\r') 
      self.saw_progress = False 
     else: 
      sys.stdout.write(s) 

    def flush(self): 
     sys.stdout.flush() 

def some_task(): 
    with settings(user = 'root'): 
     run('./task_with_progress_bar.out', stdout = FixProgress()) 

これが問題のCプログラムでは正常に働いていた。ここでは、そのような例を識別するために"Progress:"を探す試みがあります。

+0

設定 'pty = False'はトリックをしなかった、と出力がユーザーが見るために必要なので、私は出力を抑制することはできません(例えばユーザーからの入力が必要です)... –

+0

エレガントなソリューション、正確に私が探していた、ありがとう! –

+0

btw、 'run()'はどのような引数を取るのですか? doc(http://docs.fabfile.org/en/1.11/api/core/operations.html?highlight=run#fabric.operations.run)は '* args、** kwargs'のみを表示しますが、指定しません... –

0

プログレスバーを出力するcファイルのソースコードを変更できる場合は、isdty()を使用してstdinがttyであるかどうかをテストできます。 25.

http://linux.die.net/man/3/isatty

+0

私はソースコードにアクセスできません... –

関連する問題