web-dev-qa-db-fra.com

Python argparse et bash complétion

Je voudrais obtenir l'auto-complétion sur mes scripts python également dans les arguments.

Je n'avais jamais vraiment compris comment fonctionnait bash_completion (pour les arguments), mais après avoir creusé, j'ai compris que:

  1. il utilise "complete" pour lier une fonction d'achèvement à une commande
  2. chaque fonction d'achèvement est essentiellement une copie de l'analyseur d'argument

Le deuxième point en particulier n'est pas génial, car j'aimerais qu'il soit généré automatiquement.

La meilleure chose serait que le Shell demande à mon programme à chaque TAB ce qu'il faut terminer, mais j'ai l'impression que cela ne peut pas vraiment fonctionner, est-ce correct?

La deuxième option est probablement juste d'écrire un convertisseur à partir d'un analyseur argparse vers une fonction Shell qui se termine correctement.

55
andrea_crotti

Auto-promotion sans vergogne: https://github.com/kislyuk/argcomplete

argcomplete fournit l'achèvement de bash pour argparse.

62
weaver

Bash "complétion" est vraiment super. Et facile pour les programmes écrits en Python ....

Je pense que c'est exactement ce que vous voulez: optcomplete: Shell Completion Self-Generator for Python . Il est disponible, par exemple, en tant que package "python-optcomplete" dans Ubuntu.

Vous insérez quelques lignes dans votre programme python, et l'utilisateur (une fois) exécute le programme bash "complete" pour dire à bash comment compléter les arguments:

complete -F _optcomplete <program>

et maintenant l'utilisateur a terminé! Par défaut, il donne une complétion simple sur les options du programme. Reportez-vous à l'exemple pour savoir comment personnaliser l'achèvement pour une option particulière. Il est magnifiquement écrit et facile à étendre pour gérer les sous-commandes, les options de complétion alternatives, etc.!

Mise à jour:

Pour l'achèvement dans zsh (pour optparse et argparse) voir genzshcomp 0.3.1: Python Index du paquet

Comme indiqué par @englebip, nous avons encore besoin de quelque chose de similaire pour le nouveau module argparse, introduit dans Python 2.7 et 3.2, puisque optparse est maintenant obsolète.

Voici la discussion sur l'évolution dans cette direction:

Voir aussi ce contexte sur la façon dont cela est fait: Comment argparse (et l'optparse déconseillée) répondent-ils à la pression de la touche 'tab' après python, en bash? - Stack Overflow

13
nealmcb