29

我的 Python 程序可以使用一系列不同的选项(或子命令)启动,例如:

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

我希望它使用自动完成功能,这样如果我输入“myProgram d”,它会返回“myProgram doSomething”,如果我输入“myProgram n”,它会呈现“myProgram nowDoSomethingDifferent”。这类似于模块rlcompleter的平均使用,但它不会从文件系统(或历史记录)中选择可能的完成选项,而是从一组自定义字符串(对应于我的程序的可用选项)中选择可能的完成选项

关于如何实现这一点的任何想法?

我知道变量 PYTHONSTARTUP (它应该指向一个我不知道如何编写的文件)。

作为一个工作示例,django-admin(来自 django 包)具有我正在寻找的相同功能

4

6 回答 6

38

创建一个文件“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
于 2009-01-09T10:20:23.557 回答
15

有一个optcomplete模块,它允许您在 python 程序中编写 bash 自动完成的完成。这与 optparse 结合使用非常有用。您只需定义一次参数,将以下内容添加到您的 .bashrc

complete -F _optcomplete <program>

您的所有选项都将自动完成。

于 2009-01-09T12:36:32.823 回答
9

正如其他答案中提到的,在 bash 中,这可以使用 bash-builtin 来完成complete。比编写函数(如richq 的答案)更容易的是使用complete's 选项-W,它可以让您指定单词列表。在您的示例中,这将是:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

由于它是单行的,因此您不必为此创建文件,但您可以将其放入您的.bashrc.

于 2014-08-01T14:01:53.737 回答
6

如果我理解正确,您希望在 python 脚本启动之前在命令行上完成行。那么你不应该搜索python解决方案,而是查看shell功能。

如果您使用 bash,您可以查看 /etc/bash_completion,至少在 debian/ubuntu 上,您应该在 /etc/bash_completion.d/ 中创建一个文件,指定程序的完成。

于 2009-01-09T09:24:07.633 回答
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,无论你使用什么)。例如,请参阅bash 自动完成简介(也是第 2 部分)。例如zsh,请参阅本指南

于 2009-01-09T09:21:41.037 回答
0

如果你希望你的程序选择一个命令行选项,即使你只使用了这个选项的缩写形式,你应该看看标准库中的optparse 模块

于 2009-01-09T09:28:28.310 回答