Onglet personnalisé achèvement en python argparse
Comment obtenir shell onglet achèvement de coopérer avec argparse
dans un script Python?
#!/usr/bin/env python
import argparse
def main(**args):
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('positional', choices=['spam', 'eggs'])
parser.add_argument('--optional', choices=['foo1', 'foo2', 'bar'])
args = parser.parse_args()
main(**vars(args))
Avec un exécutable drapeau de l' .py fichier, les résultats attendus doivent être quelque chose comme:
$ ./example.py sp<tab>
-> completes to "./example.py spam"
$ ./example.py --op<tab>
-> completes to "./example.py --optional"
$ ./example.py --optional b<tab>
-> completes to "./example.py --optional bar"
$ ./example.py --optional f<tab>
-> completes to "./example.py --optional foo"
and, additionally, prints "foo1 foo2" choices on stdout on a new line
- Il a un peu d'information de fond: stackoverflow.com/questions/9568611/...
Vous devez vous connecter pour publier un commentaire.
Ont un coup d'oeil à argcomplete par Andrey Kislyuk.
De l'installer avec:
Importer le module et ajouter une ligne dans votre code source avant d'appeler
parser.parse_args()
:et assurez-vous que bash sait à propos de ce script, vous utilisez
vous devriez mettre cette ligne dans votre
~/.bashrc
ou suivre argcomplete de docs et d'activer 'global' achèvement.Après que vous la fin des travaux demandés.
La façon dont cela fonctionne est que l'eval ligne crée une fonction
_python_argcomlete
qui est enregistré à l'aide decomplete
. (Exécuterregister-python-argcomplete your_script
d'avoir juste un coup d'oeil à ce qui se eval-ed en bash). La fonction d'auto-complétion regarde pour les variables d'environnement définies par le bash mécanisme d'auto-complétion pour voir si elle a besoin d'agir. Si il agit, il quitte le programme. Si elle n'agit pas, c'est un appel normal au programme de cette fonction ne fait rien et le flux normal du programme continue.# PYTHON_ARGCOMPLETE_OK
au début du fichier Python (par exemple, sur la deuxième ligne, juste après la#!/usr/bin/env python
), ou l'auto-complétion ne fonctionne pas. Je suggère de modifier le code dans la réponse, l'ajout de ladite ligne de commentaire.PYTHON_ARGCOMPLETE_OK
. L'onglet global d'achèvement et les exigences mentionnées dans le lien dans l'article (et maintenant dans votre commentaire), qui est assez bon.activate-global-python-argcomplete
disponible (je pense que cela peut être plutôt neuf, que je ne me souviens pas qu'il soit là la dernière fois que j'ai regardé).argparse
ajoutant argcomplete à essayer il est vraiment peu de travail.Pour l'auto-complétion fonctionne, vous devez avoir un bash de fonction pour générer les options possibles, et puis vous avez besoin pour exécuter
complete -F <function_name> <program_name>
La meilleure façon de le faire est d'avoir le programme de générer la fonction d'achèvement sur la base de sa propre analyse de l'algorithme afin d'éviter la duplication. Cependant, lors d'un rapide coup d'œil sur argparse, je ne pouvais pas trouver un moyen d'accéder à la structure interne, mais je vous suggère de regarder pour cela.
Ici est une fonction bash qui va le faire pour le programme ci-dessus:
optcomplete
équivalent pourargparse
va faire le travail, mais d'autres (même partielle) des solutions sont aussi les bienvenus.