2012-01-13 5 views
3

は、私はこのように設定ファブリックタスクを持っている:なぜ私はファブリック経由でredis-cliと対話できないのですか?

@task 
def cli(): 
    command = [ 
     os.path.join(env.servers_path, "bin", "redis-cli"), 
    ] 

    run(" ".join(command)) 

は、それは私にプロンプ​​トを与えて実行しているが、ないインタラクティビティ:

$ fab cli            
[server] Executing task 'cli' 

[server] Executing task 'redis.cli' 
[server] run: /path/to/bin/redis-cli 
[server] out: redis 127.0.0.1:6379> help 
<no output produced> 

がさらにタイピングが生成する「アウト:」私は上に入力することをプロンプトしかし、決して赤字から戻ってくるものはありません。私はいくつかの他の対話プロンプトに変更した場合

はしかし、私は双方向性を得るか:

@task 
def cli(): 
    command = [ 
     "python" 
    ] 

    run(" ".join(command)) 

は生成します。

$ fab cli            
[server] Executing task 'cli' 
[server] run: python 
[server] out: Python 2.4.3 (#1, Sep 3 2009, 15:37:37) 
[server] out: [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 
[server] out: Type "help", "copyright", "credits" or "license" for more information. 
[server] out: >>> a = 1 
[server] out: >>> a 
[server] out: 1 
[server] out: >>> 

は、誰もがRedisの-CLIは」doesnの理由を私に任意のヒントを提供することができますうまく動く?私はそのプロジェクトでバグを開こうと思っていますが、まずそれをよりよく理解したいと思います。

答えて

4

これは、インタラクティブモードのredis-cliが実際に端末で動作するように設計されているためです。ファブリックは、おそらく標準の入出力ファイル記述子をリダイレクトするredis-cliを実行します。

たとえば、次のコマンドが正常に動作します:

python | cat 

次1はそうではない:readlineのような施設が正常にフラッシュしていない提供

redis-cli | cat 

Redisの-CLIおよびlinenoiseライブラリ出力には非終端のファイル記述子を使います。に対処するための簡単なprintf関数を使用するために起こる非常に基本的なコードパス上のダム、linenoiseデフォルトにTERM変数を定義することにより

TERM=dumb redis-cli | cat 

:私は生地を試していない可能性の回避策は、linenoiseを無効にすることですプロンプトを表示して、出力の直後に出力をフラッシュします。この変数をプロセス環境で設定できる場合は、ファブリックの問題を解決する可能性があります。

+0

ありません。後世のために、そのように用語を設定すると、コマンドラインのナビゲーション(左矢印、右矢印)は削除されますが、バックスペースは保存されます。 –

3

シンプルでクールな回答が見つかりました。エコーとパイプを通してあなたが好きなコマンドを送信します。

  • echo "keys *" | redis-cli
  • か、具体的にあなたのケースのために:おかげで、私は好きなように精神的に満足、間違いなく効果的なrun("echo 'keys *' | redis-cli")
関連する問題