Python argparse and bash completion
I would like to get auto-completion on my python scripts also in the arguments.
I had never really understood how the bash_completion worked (for arguments), but after I digged in I understood that:
- it uses "complete" to bind a completing function to a command
- every completing function basically is a copy of the argument parser
The second point in particular is not great, because I would like to have it automatically generated.
The best thing would be that the shell asks to my program at every TAB about what to complete, but I have the impression that this can't really work, is that correct?
The second option is probably just to write a converter from an argparse parser to a shell function which completes correctly.
Solution 1:
Shameless self-promotion: https://github.com/kislyuk/argcomplete
argcomplete provides bash completion for argparse.
Solution 2:
Bash "completion" really is great. And easy for programs written in Python....
I think this is just what you want: optcomplete: Shell Completion Self-Generator for Python. It is available, e.g., as the "python-optcomplete" package in Ubuntu.
You insert a few lines in your python program, and the user (one time) runs the bash "complete" program to tell bash how to complete the arguments:
complete -F _optcomplete <program>
and now the user has completion! By default it gives simple completion on program options. See the example for how to customize how completion works for a particular option. It is beautifully written, and easy to extend to handle sub-commands, alternate completion options, etc.!
Update:
For completion in zsh (for both optparse and argparse) see genzshcomp 0.3.1 : Python Package Index
As noted by @englebip, we still need something similar for the new argparse
module, introduced in Python 2.7 and 3.2, since optparse
is now deprecated.
Here is the discussion on moving in that direction:
- Mailing List Archive: [issue14103] argparse: add ability to create a bash_completion script
- Issue 55 - argparse - add a utilities for shell autocompleters to hook into as well as support for extending completion info - Python command line parsing - Google Project Hosting
See also this background on how it is done: How does argparse (and the deprecated optparse) respond to 'tab' keypress after python program name, in bash? - Stack Overflow