2012-01-13 88 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> 

进一步分型产生的“出:”提示我输入到,但是我从来没有从redis那里得到任何回报。

不过,如果我更改为其他互动提示下,我得到的交互性:

@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没有按” t表现很好吗?我想打开该项目的一个错误,但我想首先更好地理解它。

回答

4

我认为这是由于交互模式下的redis-cli实际上是设计用于终端,而fabric可能运行redis-cli重定向标准输入/输出文件描述符。

例如,下面的命令正常工作:

python | cat 

而下面一个没有:

redis-cli | cat 

Redis的-CLI和linenoise库提供的readline般的设施不正确地刷新带有非终端文件描述符的输出。可能的解决方法,我还没有和布试过,就是停用linenoise:

TERM=dumb redis-cli | cat 

通过定义这恰好用一个简单的printf对付一个非常基本的代码路径上的TERM变量哑,linenoise默认提示并在显示后立即刷新输出。如果您可以在流程环境中设置此变量,它可能会解决您的结构问题。

+0

还不如追求精神上的满足,因为我想,但绝对有效的,谢谢。对于后人来说,设置术语可以消除命令行导航(左箭头,右箭头),但会保留退格,这是我所期望的,因为您已经描述了关于该库的内容。 – 2012-01-18 21:14:31

3

我刚刚发现一个简单而酷的答案;发送任何你想要的命令,通过回声和管:

  • echo "keys *" | redis-cli
  • 或专门针对您的情况:run("echo 'keys *' | redis-cli")
相关问题