Python argparse 和 bash 完成

问题描述 投票:0回答:2

我希望在参数中也能自动完成我的 python 脚本。

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

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

第二点尤其不是很好,因为我希望它自动生成。

最好的事情是 shell 在每个选项卡上询问我的程序要完成什么,但我的印象是这实际上不起作用,对吗?

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

python argparse bash-completion
2个回答
81
投票

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

argcomplete 为 argparse 提供 bash(和 zsh)补全。


14
投票

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

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

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

complete -F _optcomplete <program>

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

更新:

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

正如 @englebip 所指出的,对于 Python 2.7 和 3.2 中引入的新

argparse
模块,我们仍然需要类似的东西,因为
optparse
现已弃用。

以下是关于朝这个方向前进的讨论:

另请参阅有关如何完成此操作的背景:argparse(以及已弃用的 optparse)如何响应 bash 中 python 程序名称后面的“tab”按键? - 堆栈溢出

© www.soinside.com 2019 - 2024. All rights reserved.