我的Python程序可以使用一系列不同的选项(或子命令)启动,如:
$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent
我希望它使用自动完成功能,这样如果我输入“myProgram d”它会返回“myProgram doSomething”,如果我输入“myProgram n”,它会呈现“myProgram nowDoSomethingDifferent”。这类似于模块 rlcompleter 的平均使用,但它不从文件系统(或从历史记录)中选择可能的完成选项,而是从一组自定义字符串中选择(对应于可用的选项)我的节目)
关于如何实现这个的任何想法?
我知道变量PYTHONSTARTUP(它应该指向一个我不知道如何写的文件)。
作为一个工作示例,django-admin(来自django包)具有我正在寻找的相同功能
答案 0 :(得分:37)
创建一个文件“myprog-completion.bash”并将其源于.bashrc文件中。这样的事情可以让你开始......
_myProgram()
{
cur=${COMP_WORDS[COMP_CWORD]}
case "${cur}" in
d*) use="doSomething" ;;
n*) use="nowDoSomethingElse" ;;
esac
COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o default -o nospace -F _myProgram myProgram
答案 1 :(得分:15)
模块 optcomplete 允许您在python程序中编写bash自动完成的完成。这与optparse结合使用非常有用。您只需定义一次参数,将以下内容添加到.bashrc
complete -F _optcomplete <program>
并且所有选项都将自动完成。
答案 2 :(得分:8)
正如其他答案所述,在bash中可以使用bash-builtin complete
完成。比编写函数更容易(如在richq's answer中)使用complete
的选项-W
,它允许您指定单词列表。在您的示例中,这将是:
complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram
因为它是单行的,所以您不必为此创建文件,但您可以将其放在.bashrc
中。
答案 3 :(得分:6)
如果我理解正确,您希望在python脚本启动之前在命令行上完成行。那么你不应该搜索python解决方案,而是查看shell功能。
如果您正在使用bash,可以查看/ etc / bash_completion,至少在debian / ubuntu上,您应该在/etc/bash_completion.d/中创建一个文件,指定程序的完成。
答案 4 :(得分:3)
据我所知,PYTHONSTARTUP用于在解释器启动时执行命令[1]。 rlcompleter
用于自动填充内部您的脚本,如果它正在使用readline
库。像这样:
$ ./myscript.py
My Script version 3.1415.
Enter your commands:
myscript> B<TAB>egin
myscript> E<TAB>nd
在您的示例中,您希望在 shell 命令行上完成。此自动完成是一个shell功能(bash
或zsh
,无论您使用什么)。例如,请参阅an introduction to bash autocompletion(也part 2)。对于zsh
,请参阅this guide。
答案 5 :(得分:0)
如果您希望程序选择命令行选项,即使您只使用此选项的缩写形式,也应该查看标准库中的optparse module。