python – 为什么我不能通过结构与redis-cli交互?
发布时间:2020-12-20 11:22:50 所属栏目:Python 来源:网络整理
导读:我有一个像这样的结构任务: @taskdef 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'[
我有一个像这样的结构任务:
@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> 进一步输入会产生一个我输入的“out:”提示符,但在任何时候我都无法从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表现不佳的提示吗?我想打开该项目的错误,但我想先更好地理解它. 解决方法
我认为这是因为交互模式下的redis-cli真的设计用于终端,而Fabric可能运行redis-cli重定向标准输入/输出文件描述符.
例如,以下命令工作正常: python | cat 而以下一个不是: redis-cli | cat redis-cli和提供类似readline的工具的linenoise库不会使用非终端文件描述符正确刷新输出.我没有尝试过使用fabric的可能的解决方法是停用linenoise: TERM=dumb redis-cli | cat 通过将TERM变量定义为哑,linenoise默认在一个非常基本的代码路径上,恰好使用一个简单的printf来处理提示并在显示后立即刷新输出.如果您可以在流程环境中设置此变量,它可以解决您的结构问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |