我的Python程序可以启动一系列不同的选项(或子命令),如:
$ myProgram doSomething $ myProgram doSomethingElse $ myProgram nowDoSomethingDifferent
我希望它使用自动完成,所以如果我input“myProgram d”它返回“myProgram doSomething”,如果我键入“myProgram n”它呈现“myProgram nowDoSomethingDifferent”。 这与模块rlcompleter的平均使用类似,但是它不会从文件系统(或从历史logging)中select可能的完成选项,而是从一组自定义的string中select(对应于我的程序的可用选项)
任何想法如何实现这个?
我知道variablesPYTHONSTARTUP(应指向一个文件,我不知道如何写)。
作为一个工作的例子,django-admin(来自django包)具有相同的function,我正在寻找
创建一个文件“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
有一个模块optcomplete允许你在你的python程序中为bash自动完成编写完成。 这与optparse结合使用非常有用。 你只定义一次你的参数,将以下内容添加到你的.bashrc
complete -F _optcomplete <program>
所有的选项都将自动完成。
正如其他答案中所提到的,在bash中这可以通过bash-builtin complete
。 比写一个函数(比如在richq的答案中 )更容易使用complete
的选项-W
来让你指定一个单词列表。 在你的例子中,这将是:
complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram
因为它是一行代码,所以不必为此创建文件,但是可以将其放在.bashrc
。
如果我理解正确,在Python脚本启动之前,您需要在命令行上完成命令行。 那么你不应该搜索一个python解决方案,而是看看shell的功能。
如果你使用的是bash,你可以看看/ etc / bash_completion,至少在debian / ubuntu上你应该在/etc/bash_completion.d/中创建一个文件来指定程序的完成。
就我所知,PYTHONSTARTUP是解释器启动时执行的命令[1] 。 如果使用readline
库,则rlcompleter
用于脚本内的自动完成。 像这样的东西:
$ ./myscript.py My Script version 3.1415. Enter your commands: myscript> B<TAB>egin myscript> E<TAB>nd
在你的例子中,你想在shell命令行上完成。 这个自动完成是一个shell特性(无论你使用的是bash
还是zsh
)。 例如,参见bash自动完成的介绍 (也是第2部分 )。 有关zsh
请参阅本指南 。
如果你希望你的程序选择一个命令行选项,即使你只使用这个选项的缩写形式,你应该看看标准库中的optparse模块 。