Python - 如何查看制表符完成输出

标签 python python-2.7

我如何查看制表符完成返回的内容?

我澄清一下:

假设我打开一个 bash shell,键入 l 并单击 TAB。 我将获取所有包含 l 字符的命令。

现在,我知道如何以编程方式向 shell 输入完整命令并解析输出,

例如:

def shell_output()
    p = subprocess.Popen(command,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
    print iter(p.stdout.readline, '')

但是我怎样才能看到 TAB 补全显示的内容呢?

最佳答案

Tab 完成是 readline 模式的一部分。如果您同时处于交互模式和 TTY 上,您只会获得 readline 模式。因此,当您 Popen 它时,它的标准输入是一个管道,您无法完成制表符。

您可以通过在不使用 Python 的情况下进行测试来了解这一点:

$ socat TCP-LISTEN:12345 EXEC:bash &
$ nc localhost 12345
l<TAB>

没有任何反应。您可能会在 L 之后看到 ^I,或者 7 个空格,或者什么都没有,但您不会完成任何事情。

当然你可以强制交互模式,但它只会打开 /dev/tty 并忽略你的 stdin 管道,这没有帮助。

因此,您需要做的是使用 pty模块或 openptyforkpty函数而不是 subprocess。它远没有那么好和高级,但它确实可以工作。

当然,一旦您开始阅读 bash 的 TTY 输出,您也会开始收到终端蜂鸣声和光标移动字符;我希望你准备好处理这个问题。

更好的解决方案是不要尝试在 bash 中发送制表符,只需使用 compgen以编程方式为您完成事情:

completions = subprocess.check_output('compgen -c l', shell=True).splitlines()

-c 意味着您只需要命令名称。您可以完成一大堆事情——目录、文件名、环境变量等,任何可以在交互式提示上的任何上下文中完成的事情。如果您想要在空命令行开头完成的完全相同的事情,我相信那是 -abc -A function (别名、内置命令、命令和函数),但请阅读文档完整的细节。

关于Python - 如何查看制表符完成输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758576/

相关文章:

javascript - 名称错误 : name "something" is not defined - Web App using Angular JS and Python

python - django 1.3 用于在开发环境中进行调试的日志记录

python - 在 CSV python 中添加列并枚举它

python - 无法在Python3、Ubuntu14.04中使用pip安装NumPy

python - 如何使用 python 正则表达式避免特殊字符?

'encourage' 使用工厂方法实例化类的 Pythonic 方式

python - 如何将 networkx 算法与我的自定义图形数据结构一起使用?

python - 将 Scipy 与 Pandas 一起使用的警告

python - 构建逻辑门

python - 删除长子命令帮助输出?