Quelle est la méthode ou la bibliothèque la plus simple , la plus simple et la plus flexible pour analyser les arguments de ligne de commande Python?
Quelle est la méthode ou la bibliothèque la plus simple , la plus simple et la plus flexible pour analyser les arguments de ligne de commande Python?
Cette réponse suggère celle optparse
qui convient aux anciennes versions de Python. Pour Python 2.7 et supérieur, argparse
remplace optparse
. Voir cette réponse pour plus d'informations.
Comme d'autres l'ont souligné, il vaut mieux opter pour optparse plutôt que getopt. getopt est à peu près un mappage un à un des fonctions standard de la bibliothèque getopt (3) C, et pas très facile à utiliser.
optparse, tout en étant un peu plus verbeux, est beaucoup mieux structuré et plus simple à étendre plus tard.
Voici une ligne typique pour ajouter une option à votre analyseur:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
Il parle à peu près de lui-même; au moment du traitement, il acceptera -q ou --query comme options, stockera l'argument dans un attribut appelé query et aura une valeur par défaut si vous ne le spécifiez pas. Il est également auto-documenté en ce que vous déclarez l'argument d'aide (qui sera utilisé lorsqu'il sera exécuté avec -h / - help) directement avec l'option.
Habituellement, vous analysez vos arguments avec:
options, args = parser.parse_args()
Par défaut, cela analysera les arguments standard transmis au script (sys.argv [1:])
options.query sera alors défini sur la valeur que vous avez transmise au script.
Vous créez un analyseur simplement en faisant
parser = optparse.OptionParser()
Ce sont toutes les bases dont vous avez besoin. Voici un script Python complet qui montre ceci:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5 lignes de python qui vous montrent les bases.
Enregistrez-le dans sample.py et exécutez-le une fois avec
python sample.py
et une fois avec
python sample.py --query myquery
Au-delà de cela, vous constaterez que l'optparse est très facile à étendre. Dans l'un de mes projets, j'ai créé une classe Command qui vous permet d'imbriquer facilement des sous-commandes dans une arborescence de commandes. Il utilise largement optparse pour enchaîner les commandes. Ce n'est pas quelque chose que je peux facilement expliquer en quelques lignes, mais n'hésitez pas à parcourir mon référentiel pour la classe principale, ainsi qu'une classe qui l'utilise et l'option analyseur
-mcProfile -o program.prof
mais agrparcer capture ces arguments, comment passer ces arguments à exe python ???argparse
est la voie à suivre. Voici un bref résumé de son utilisation:1) Initialiser
2) Ajouter des arguments
3) Analyser
4) Accès
5) Valeurs de contrôle
Usage
Utilisation correcte:
Arguments incorrects:
Aide complète:
la source
Utilisation de docopt
Depuis 2012, il existe un module d'analyse des arguments très simple, puissant et vraiment cool appelé docopt . Voici un exemple tiré de sa documentation:
Alors voilà: 2 lignes de code plus votre chaîne doc qui est essentielle et vous obtenez vos arguments analysés et disponibles dans votre objet arguments.
Utiliser python-fire
Depuis 2017, il existe un autre module sympa appelé python-fire . Il peut générer une interface CLI pour votre code avec vous en n'effectuant aucune analyse d'argument. Voici un exemple simple de la documentation (ce petit programme expose la fonction
double
à la ligne de commande):Depuis la ligne de commande, vous pouvez exécuter:
la source
La nouvelle façon de hanche est
argparse
pour ces raisons. argparse> optparse> getoptmise à jour: à partir de py2.7 argparse fait partie de la bibliothèque standard et optparse est déconseillé.
la source
Je préfère cliquer . Il résume les options de gestion et permet "(...) de créer de belles interfaces de ligne de commande de manière composable avec aussi peu de code que nécessaire".
Voici un exemple d'utilisation:
Il génère également automatiquement des pages d'aide bien formatées:
la source
Presque tout le monde utilise Presque getopt
Voici l'exemple de code pour le document:
Donc en un mot, voici comment cela fonctionne.
Vous avez deux types d'options. Ceux qui reçoivent des arguments et ceux qui sont comme des commutateurs.
sys.argv
est à peu près votrechar** argv
en C. Comme en C vous sautez le premier élément qui est le nom de votre programme et n'analysez que les arguments:sys.argv[1:]
Getopt.getopt
l'analysera selon la règle que vous donnez en argument."ho:v"
ici décrit les courts arguments:-ONELETTER
. Les:
moyens qui-o
accepte un argument.["help", "output="]
Décrit enfin de longs arguments (--MORETHANONELETTER
). le=
sortie après signifie une fois de plus que la sortie accepte un argument.Le résultat est une liste de couple (option, argument)
Si une option n'accepte aucun argument (comme
--help
ici),arg
partie est une chaîne vide. Vous souhaitez ensuite généralement faire une boucle sur cette liste et tester le nom de l'option comme dans l'exemple.J'espère que cela vous a aidé.
la source
getopt
dans les versions plus récentes de Python, cette réponse est obsolète.getopt
n'est toujours pas déprécié… Mais sa documentation indique qu'il est principalement fourni pour les utilisateurs familiers avec lagetopt()
fonction C , et reconnaît que pour d'autres utilisateursargparse
pourrait être une meilleure solution, permettant d'écrire moins de code et d'obtenir meilleure aide et messages d'erreur ".Utilisation
optparse
fournie avec la bibliothèque standard. Par exemple:Source: Utilisation de Python pour créer des outils de ligne de commande UNIX
Cependant, à partir de Python 2.7, l'optparparse est obsolète, voir: Pourquoi utiliser argparse plutôt qu'optparse?
la source
Juste au cas où vous en auriez besoin, cela peut aider si vous avez besoin de récupérer des arguments Unicode sur Win32 (2K, XP, etc.):
la source
Paramètres d'argument de ligne de commande légers par défaut
Bien qu'il
argparse
soit excellent et constitue la bonne réponse pour les commutateurs de ligne de commande et les fonctionnalités avancées entièrement documentés, vous pouvez utiliser les valeurs par défaut des arguments de fonction pour gérer très simplement les arguments de position simples.L'argument 'nom' capture le nom du script et n'est pas utilisé. La sortie de test ressemble à ceci:
Pour les scripts simples où je veux juste des valeurs par défaut, je trouve cela tout à fait suffisant. Vous pouvez également vouloir inclure une certaine contrainte de type dans les valeurs de retour ou les valeurs de ligne de commande seront toutes des chaînes.
la source
Je préfère optparse à getopt. C'est très déclaratif: vous lui dites les noms des options et les effets qu'elles devraient avoir (par exemple, en définissant un champ booléen), et il vous remet un dictionnaire rempli selon vos spécifications.
http://docs.python.org/lib/module-optparse.html
la source
Je pense que le meilleur moyen pour des projets plus importants est l'optparse, mais si vous cherchez un moyen simple, http://werkzeug.pocoo.org/documentation/script est peut-être quelque chose pour vous.
Donc, fondamentalement, chaque fonction action_ * est exposée à la ligne de commande et un joli message d'aide est généré gratuitement.
la source
declarative_parser
. Bien sûr, si l'on travaille avec werkzeug, il vaut peut-être mieux garder lewerkzung.script
. Quoi qu'il en soit, je suis un grand fan d'une telle approche.Le code Argparse peut être plus long que le code d'implémentation réel!
C'est un problème que je trouve avec les options d'analyse d'arguments les plus populaires, c'est que si vos paramètres ne sont que modestes, le code pour les documenter devient disproportionnellement grand au profit qu'ils offrent.
Un nouveau venu relatif à la scène d'analyse des arguments (je pense) est plac .
Il fait des compromis reconnus avec argparse, mais utilise la documentation en ligne et s'enroule simplement autour de la
main()
fonction fonction de type:la source
consoleargs mérite d'être mentionné ici. C'est très simple à utiliser. Vérifiez-le:
Maintenant dans la console:
la source
Voici une méthode, pas une bibliothèque, qui semble fonctionner pour moi.
Les objectifs ici sont d'être concis, chaque argument analysé par une seule ligne, les arguments s'alignent pour la lisibilité, le code est simple et ne dépend d'aucun module spécial (uniquement os + sys), met en garde contre les arguments manquants ou inconnus avec élégance , utilisez une simple boucle for / range () et fonctionne sur python 2.x et 3.x
Sont affichés deux indicateurs de bascule (-d, -v) et deux valeurs contrôlées par des arguments (-i xxx et -o xxx).
Le but de NextArg () est de renvoyer l'argument suivant tout en vérifiant les données manquantes, et «ignorer» saute la boucle lorsque NextArg () est utilisé, en gardant le drapeau analysé sur une seule ligne.
la source
J'ai étendu l'approche d'Erco pour permettre les arguments positionnels requis et les arguments optionnels. Ceux-ci doivent précéder les arguments -d, -v etc.
Les arguments positionnels et facultatifs peuvent être récupérés avec PosArg (i) et OptArg (i, par défaut) respectivement. Lorsqu'un argument facultatif est trouvé, la position de départ de la recherche d'options (par exemple, -i) est avancée de 1 pour éviter de provoquer un incident fatal "inattendu".
la source