61

我也想在参数中自动完成我的 python 脚本。

我从来没有真正理解过 bash_completion 是如何工作的(对于参数),但是在我深入研究之后我明白了:

  1. 它使用“完成”将完成功能绑定到命令
  2. 每个完成函数基本上都是参数解析器的副本

特别是第二点不是很好,因为我想让它自动生成。

最好的办法是,shell 在每个 TAB 处向我的程序询问要完成什么,但我的印象是这真的行不通,对吗?

第二种选择可能只是编写一个从 argparse 解析器到正确完成的 shell 函数的转换器。

4

2 回答 2

75

无耻的自我推销:https ://github.com/kislyuk/argcomplete

argcomplete 为 argparse 提供 bash 补全。

于 2012-11-25T19:50:46.833 回答
14

Bash“完成”真的很棒。并且对于用 Python 编写的程序很容易......

我认为这正是您想要的:optcomplete: Shell Completion Self-Generator for Python。例如,它可以作为 Ubuntu 中的“python-optcomplete”包使用。

您在 python 程序中插入几行,用户(一次)运行 bash “完成”程序来告诉 bash 如何完成参数:

complete -F _optcomplete <program>

现在用户已经完成了!默认情况下,它会简单地完成程序选项。请参阅示例,了解如何自定义完成特定选项的工作方式。它写得很漂亮,并且易于扩展以处理子命令、替代完成选项等!

更新:

要在 zsh 中完成(对于 optparse 和 argparse),请参阅genzshcomp 0.3.1:Python 包索引

正如@englebip 所指出的,我们仍然需要为argparsePython 2.7 和 3.2 中引入的新模块提供类似的东西,因为optparse现在已弃用。

以下是关于朝那个方向发展的讨论:

另请参阅有关如何完成的背景: argparse(和不推荐使用的 optparse)如何在 python 程序名称后响应 'tab' keypress,在 bash 中?- 堆栈溢出

于 2012-02-23T18:32:43.590 回答