Python argparse 与 bash 自动补全
我希望在我的Python脚本中,参数也能实现自动补全。
我之前一直不太明白bash_completion是怎么工作的(特别是参数部分),但经过一番研究后,我明白了:
- 它使用“complete”来将一个补全函数绑定到一个命令上。
- 每个补全函数基本上都是参数解析器的一个副本。
特别是第二点让我有点失望,因为我希望这个过程能够自动生成。
最理想的情况是,终端在每次按下TAB键时都能询问我的程序该补全什么,但我觉得这可能不太可行,是这样吗?
第二个选择可能就是写一个转换器,把argparse解析器转换成一个可以正确补全的shell函数。
2 个回答
Bash 的“补全”功能真的很棒。而且对于用 Python 写的程序来说也很简单。
我觉得这正是你需要的:optcomplete:Python 的 Shell 补全自生成工具。在 Ubuntu 中可以找到这个工具,比如作为“python-optcomplete”这个包。
你只需要在你的 Python 程序中插入几行代码,然后用户(只需一次)运行 bash 的“complete”程序来告诉 bash 如何补全参数:
complete -F _optcomplete <program>
现在用户就可以享受补全功能了!默认情况下,它会对程序选项进行简单的补全。你可以查看示例,了解如何自定义特定选项的补全方式。这个工具写得非常好,而且很容易扩展,可以处理子命令、替代补全选项等等!
更新:
如果你想在 zsh 中实现补全(对于 optparse 和 argparse),可以查看 genzshcomp 0.3.1:Python 包索引
正如 @englebip 提到的,我们仍然需要类似的工具来支持新的 argparse
模块,这个模块在 Python 2.7 和 3.2 中引入,因为 optparse
现在已经不推荐使用了。
这里有关于朝这个方向发展的讨论:
- 邮件列表归档:[issue14103] argparse:添加创建 bash_completion 脚本的能力
- 问题 55 - argparse - 添加一个工具,供 shell 自动补全器使用,并支持扩展补全信息 - Python 命令行解析 - Google 项目托管
还可以查看这个背景信息,了解它是如何实现的:argparse(和不推荐使用的 optparse)在 bash 中如何响应程序名称后的 'tab' 键? - Stack Overflow
自我宣传一下:https://github.com/kislyuk/argcomplete
argcomplete 是一个工具,可以为 argparse 提供 bash(和 zsh)的自动补全功能。