54 votes

Python argparse et complétion bash

J'aimerais avoir l'auto-complétion sur mes scripts python aussi dans les arguments.

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

  1. il utilise "complete" pour lier une fonction de complétion à une commande
  2. chaque fonction d'achèvement est fondamentalement une copie de l'analyseur d'arguments.

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

L'idéal serait que le shell demande à mon programme à chaque TAB ce qu'il doit compléter, mais j'ai l'impression que cela ne peut pas vraiment fonctionner, est-ce correct ?

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

64voto

weaver Points 491

Autopromotion éhontée : https://github.com/kislyuk/argcomplete

argcomplete fournit la complétion bash pour argparse.

13voto

nealmcb Points 1223

Bash "completion" (achèvement) est vraiment génial. Et facile pour les programmes écrits en Python....

Je pense que c'est exactement ce que vous voulez : optcomplete : Auto-générateur de complétion de shell pour Python . Il est disponible, par exemple, sous la forme du paquet "python-optcomplete" dans Ubuntu.

Vous insérez quelques lignes dans votre programme python, et l'utilisateur exécute (une fois) le programme bash "complete" pour indiquer à 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. Consultez l'exemple pour savoir comment personnaliser le fonctionnement de la complétion 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 : Index des paquets Python

Comme l'a fait remarquer @englebip, nous avons toujours besoin de quelque chose de similaire pour le nouveau système de gestion de l'eau. argparse introduit dans Python 2.7 et 3.2, depuis le module optparse est maintenant déprécié.

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

Voir aussi cet historique sur la façon dont cela se passe : Comment argparse (et l'ancien optparse) réagit-il à la pression de la touche 'tab' après le nom du programme python, en bash ? - Débordement de pile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X