Quelle est la meilleure façon d'analyser les arguments de ligne de commande?
Quelle est la plus facile, tersest, et la plupart des flexible méthode ou d'une bibliothèque pour l'analyse Python arguments de ligne de commande?
Vous devez vous connecter pour publier un commentaire.
Cette réponse suggère
optparse
qui est approprié pour les anciennes versions de Python. Pour Python 2.7 et au-dessus,argparse
remplaceoptparse
. Voir cette réponse pour plus d'informations.Que d'autres personnes nous ont fait remarquer, vous êtes mieux d'aller avec optparse plus de getopt. getopt est à peu près un one-to-one mapping de la norme getopt(3) fonctions de la bibliothèque C, et pas très facile à utiliser.
optparse, tout en étant un peu plus verbeux, est beaucoup mieux structuré et le plus simple pour étendre plus tard.
Voici un typique de la ligne pour ajouter des options à votre parser:
Il parle de lui-même; au temps de traitement, il acceptera -q ou --requête comme des options, des magasin de l'argument dans un attribut appelé requête et a une valeur par défaut si vous ne spécifiez pas d'elle. Il est également l'auto-documentation dans la déclaration de l'aide de l'argument (qui sera utilisé lors de l'exécution avec -h/--help) juste ici avec l'option.
Habituellement, vous analysez vos arguments avec:
Ce sera, par défaut, l'analyse de la norme arguments passés au script (sys.argv[1:])
options.la requête sera ensuite mis à la valeur que vous avez passés au script.
Vous créer un analyseur simplement en faisant
Ce sont toutes les bases dont vous avez besoin. Voici un script Python qui le montre:
5 lignes de python que vous montrer les bases.
L'enregistrer dans sample.py et le lancer une fois avec
et une fois avec
Au-delà de cela, vous trouverez que optparse est très facile à étendre.
Dans un de mes projets, j'ai créé une classe de Commande qui vous permet de nid sous-commandes dans un arbre de commande facilement. Il utilise optparse fortement à la chaîne de commandes. Ce n'est pas quelque chose que je peux facilement expliquer en quelques lignes, mais n'hésitez pas à parcourir autour de mon référentiel pour la classe principale, ainsi que une classe qui l'utilise et l'option analyseur
Autres réponses ne mentionner que
argparse
est le chemin à parcourir pour Python, mais ne donnent pas d'exemples d'utilisation. Pour être complet, voici un court résumé de comment utiliser argparse:1) Initialiser
2) Ajouter Des Arguments
3) Analyser
4) l'Accès
5) Vérifier Les Valeurs
Utilisation
Utilisation correcte:
Incorrect d'arguments:
D'aide complet:
À l'aide de docopt
Depuis 2012 Python est très simple, puissant et vraiment cool module pour l'argument d'analyse appelé docopt. Il fonctionne avec Python 2.6 3.5 et ne nécessite aucune installation (il suffit de le copier). Voici un exemple tiré de la documentation:
Donc ce que c'est: 2 lignes de code en plus de votre doc chaîne qui est essentiel et vous obtenez vos arguments analysées et disponibles dans votre objet arguments. Je vous l'ai dit c'est cool, n'ai-je pas 😉
À l'aide de python-le-feu
Depuis 2017 python-le-feu a un autre cool module qui peut donner à une interface CLI de votre code en vous faisant zéro argument de l'analyse. Voici un exemple simple de la documentation (ce petit programme expose fonction
double
à la ligne de commande):À partir de la ligne de commande, vous pouvez exécuter:
Génial n'est-ce pas?
La nouvelle hanche façon est
argparse
pour ces raisons. argparse > optparse > getoptmise à jour: de py2.7 argparse fait partie de la bibliothèque standard et optparse est obsolète.
Je préfère Cliquez sur. Il les résumés gestion d'options et permet de "(...) la création de belle ligne de commande interfaces dans une composable façon avec aussi peu de code que nécessaire".
Voici un exemple d'usage:
Il génère également automatiquement formatés que les pages d'aide:
Presque tout le monde est à l'aide de getopt
Voici le code d'exemple de la doc :
Donc, en un mot, ici, est de savoir comment il fonctionne.
Vous avez deux types d'options. Ceux qui reçoivent des arguments, et ceux qui sont
tout comme les commutateurs.
sys.argv
est assez bien votrechar** argv
dans C. Comme en C, vous passez le premier élément qui est le nom de votre programme et d'analyser uniquement les arguments :sys.argv[1:]
Getopt.getopt
va l'analyser selon la règle de vous donner en argument."ho:v"
décrit ici la court d'arguments :-ONELETTER
. Le:
signifie que-o
accepte un seul argument.Enfin
["help", "output="]
décrit long des arguments (--MORETHANONELETTER
).Le
=
après la sortie, une fois encore, signifie que la sortie accepte un argument.Le résultat est une liste de couple (en option), argument)
Si une option n'accepte aucun argument (comme
--help
ici) learg
partie est une chaîne vide.Ensuite, vous voulez généralement à boucle sur cette liste et de tester le nom de l'option, comme dans l'exemple.
J'espère que cela vous a aidé.
getopt
dans les plus récentes versions de Python cette réponse a disparu de la date.getopt
est pas encore obsolète... Mais documentation indique qu'il est principalement prévu pour les utilisateurs familiers avec le Cgetopt()
fonction, et reconnaît que pour les autres utilisateursargparse
pourrait être une meilleure solution, ce qui permet "d'écrire moins de code et de mieux les aider et les messages d'erreur".Utilisation
optparse
qui vient avec la bibliothèque standard. Par exemple:Source: À l'aide de Python pour créer des outils de ligne de commande UNIX
Cependant que de Python 2.7 optparse est obsolète, voir: Pourquoi utiliser argparse plutôt que optparse?
Juste au cas où vous pourriez avoir besoin, cela peut vous aider si vous avez besoin de saisir unicode arguments sur Win32 (2K, XP, etc):
Léger argument de ligne de commande par défaut
Bien que
argparse
est grand et c'est la bonne réponse pour entièrement documenté commutateurs de ligne de commande et de fonctions avancées, vous pouvez utiliser la fonction argument par défaut pour les poignées de simples arguments de position très simplement.Le nom de l'argument saisit le nom du script et n'est pas utilisé. Test de sortie ressemble à ceci:
Pour de simples scripts où je veux juste quelques valeurs par défaut, je trouve cela tout à fait suffisant. Vous pouvez également inclure un certain type de coercition dans les valeurs de retour de la ligne de commande ou des valeurs pourront être des chaînes de caractères.
Je pense que la meilleure façon pour les grands projets est optparse, mais si vous cherchez un moyen facile, peut-être http://werkzeug.pocoo.org/documentation/script est quelque chose pour vous.
Donc, fondamentalement, chaque fonction action_* est exposée à la ligne de commande et une belle
message d'aide est généré pour gratuit.
declarative_parser
. Bien sûr, si l'on travaille avec werkzeug, il peut être préférable de garder lawerkzung.script
. De toute façon, je suis un grand fan de cette approche.Je préfère optparse de getopt. Il est très déclarative: vous dire les noms des options et les effets qu'ils auraient dû l'être (par exemple, la fixation d'un champ booléen), et il vous tend de retour d'un dictionnaire renseignée selon votre cahier des charges.
http://docs.python.org/lib/module-optparse.html
consoleargs mérite d'être mentionné ici. Il est très facile à utiliser. Check it out:
Maintenant dans la console:
Argparse code peut être plus long que la réelle mise en œuvre du code!
C'est un problème que j'ai trouver avec plus populaire argument options d'analyse, c'est que si vos paramètres ne sont modestes, le code du document devient disproportionnée des avantages qu'ils offrent.
Un relatif à la nouvelle-comer à l'argument de l'analyse de la scène (je pense) est plac.
C'est un peu reconnu de compromis avec argparse, mais utilise inline documentation et enroule simplement autour de
main()
fonction du type de fonction:Voici une méthode, pas une bibliothèque, qui semble fonctionner pour moi.
Les objectifs ici sont à faire court, chaque argument analysé par une seule ligne, les arguments de la ligne pour des raisons de lisibilité, le code est simple et ne dépend pas des modules spéciaux (seul l'os + sys), prévient en cas de manquant ou inconnu arguments gracieusement, utilisez-en un pour/range() de la boucle, et fonctionne sur python 2.x et 3.x
Indiqués sont deux à bascule drapeaux (-u, -v), et deux valeurs contrôlées par des arguments (-i xxx et -o xxx).
Le but de NextArg() est de retourner l'argument suivant lors de la vérification des données manquantes, et "skip" saute la boucle lors de la NextArg() est utilisé, garder le drapeau de l'analyse à un seul doublures.
J'ai prolongé d'Erco approche pour permettre tenu des arguments de position et des arguments optionnels. Ceux-ci devraient précéder l'-d-v etc. les arguments.
De position et les arguments optionnels peuvent être récupérées avec PosArg(i) et OptArg(j'ai, par défaut), respectivement.
Lorsqu'un argument optionnel est trouvé à la position de départ de la recherche d'options (ex -i) est déplacé 1 à l'avance pour éviter de créer un "inattendue" fatale.