Comment lire/processus d'arguments de ligne de commande?
Je suis à l'origine un programmeur C. J'ai vu à de nombreuses astuces et des "hacks" de lire de nombreux arguments différents.
Quelles sont certaines des façons de Python pour les programmeurs peuvent faire cela?
Connexes
- Quelle est la meilleure façon de saisir et d'analyser la ligne de commande arguments passés à un script Python?
- Mise en œuvre d'un “[commande] [action] [paramètre]” style interfaces de ligne de commande?
- Comment puis-je traiter les arguments de ligne de commande en Python?
- Comment puis-je format de position argument aide sur l'utilisation de Python optparse?
- Utilisation docopt (voir @ralbatross de répondre à stackoverflow.com/a/14790373/116891). J'ai essayé tous les autres et, vraiment, docopt est le seul que je vais l'utiliser à l'avenir.
- Je ne pense pas qu'il y a une meilleure façon. argparse est standard et plein de fonctionnalités. docopt est très élégant, mais pas dans la bibliothèque standard. Pour les très léger facile d'utilisation, vous pouvez créer une fonction par défaut, les valeurs de gérer le système comand argument de ligne de valeurs par défaut pour vous.
Vous devez vous connecter pour publier un commentaire.
La solution canonique dans la bibliothèque standard est
argparse
(docs):Voici un exemple:
argparse
prend en charge (entre autres choses):optparse
est obsolète, le sens de la question n'est plus un membre sur un débordement de pile, et c'est la réponse sur un très visibles question - veuillez prendre en considération la réécriture complète de votre exemple de code pour utiliser stdlibargparse
à la place.sys.argv
est une liste qui contient tous les arguments passés au script sur la ligne de commande.Fondamentalement,
sys.argv[1:]
(évite le nom du script).Juste d'aller autour de l'évangélisation pour argparse ce qui est mieux pour ces raisons.. essentiellement:
(copié à partir du lien)
argparse module peut gérer de position
et les arguments optionnels, tandis que
optparse peut gérer uniquement en option
les arguments
argparse n'est pas dogmatique sur
ce que votre interface de ligne de commande
devrait ressembler - comme les options de fichier
ou /fichier sont pris en charge, comme le sont
les options requises. Optparse refuse de
prendre en charge ces fonctionnalités, préférant
la pureté de plus de praticité
argparse produit plus
un usage informatif messages, y compris les
de ligne de commande utilisation déterminée à partir de
vos arguments, et les messages d'aide pour
à la fois la position et facultatif
les arguments. Le module optparse
vous oblige à écrire votre propre utilisation
chaîne, et n'a pas de moyen d'afficher
de l'aide pour les arguments de position.
argparse soutient les actions qui
consommer un nombre variable de
en ligne de commande args, tandis que optparse
exige que le nombre exact de
des arguments (par exemple 1, 2, ou 3) être connu
à l'avance
argparse prend en charge analyseurs qui
envoi de sous-commandes, tandis que
optparse nécessite la mise en
allow_interspersed_args
et de faire leanalyseur d'expédition manuellement
Et mon préféré:
les paramètres d'action pour
add_argument()
pour être spécifiée avec de simples
callables, tandis que optparse exige
le piratage des attributs de classe comme
STORE_ACTIONS
ouCHECK_METHODS
pour obtenirbon argument de la vérification
-f
ou--foo
, tandis que "nombre exact d'arguments soient connus à l'avance" signifie probablement des arguments de position donnée sans précédent indicateurs d'option.Il est également
argparse
stdlib module (un "impovement" sur stdlib deoptparse
module). Exemple de l'introduction de argparse:Utilisation:
Une façon de le faire est d'utiliser
sys.argv
. Cela permettra d'imprimer le nom du script comme premier argument et tous les autres paramètres que vous lui transmettez.La docopt bibliothèque est vraiment lisse. Il construit un argument dict de l'utilisation de la chaîne pour votre application.
Par exemple à partir de la docopt readme:
Si vous avez besoin quelque chose de rapide et pas très souple
main.py:
Puis exécutez
python main.py James Smith
pour produire le résultat suivant:
python main.py "James Smith"
qui metJames Smith
danssys.argv[1]
et produit uneIndexError
lorsque vous essayez d'utiliser l'inexistantsys.argv[2]
. Citant le comportement va un peu dépendre de la plate-forme et shell vous exécutez Python.python main.py "James Joseph Smith"
? Si vous êtes concernés par l'indice hors limites, vous pouvez ajouter une vérification du nombre d'arguments fournis. Moins réaliste ou non, mon exemple montre comment gérer plusieurs arguments.gmail-trash-msg.py MessageID
. Cette réponse est simple pour testerMessageID
paramètre a été adoptée ensys.argv[1]
.- Je utiliser optparse moi-même, mais vraiment comme la direction de Simon Willison prend avec son récemment introduit optfunc de la bibliothèque. Il fonctionne par:
Ainsi, par exemple, la définition de cette fonction:
est transformé en ce optparse texte d'aide:
J'aime getopt de stdlib, par exemple:
Dernièrement, j'ai été habillage quelque chose de semblable à ce à rendre les choses moins verbeux (par exemple; faire "-h" implicite).
Comme vous pouvez le voir optparse "Le module optparse est obsolète avec et ne sera pas développé plus loin; le développement se poursuivra avec la argparse module".
Pocoo de cliquez sur est plus intuitive, nécessite moins passe-partout, et est au moins aussi puissant que argparse.
La seule faiblesse que j'ai rencontré jusqu'à présent, c'est que vous ne pouvez pas faire beaucoup de personnalisation pour les pages d'aide, mais qui, généralement, n'est pas une obligation et docopt semble être le choix évident quand il est.
Vous pouvez être intéressé par un petit module Python que j'ai écrit pour rendre le traitement des arguments de ligne de commande encore plus facile (open source et libre d'utilisation) - Commando
Je recommande à la recherche à docopt comme une simple alternative à ces les autres.
docopt est un nouveau projet qui fonctionne par l'analyse de votre --help message sur l'utilisation plutôt que de vous obliger à tout mettre en œuvre vous-même. Vous avez juste à mettre votre message dans le format POSIX.
Encore une autre option est argh. Il s'appuie sur argparse, et vous permet d'écrire des choses comme:
Il va générer automatiquement de l'aide et ainsi de suite, et vous pouvez utiliser les décorateurs afin de fournir des conseils supplémentaires sur la façon dont l'arg-l'analyse devrait fonctionner.
argh
est plus facile que d'un autre syndicat ou à l'aide desys
.argh
mais il n'est pas particulièrement adapté pour les scénarios où votre plus grand désir est de ne pas avoir de commande avec les sous-commandes.def frobnicate_spleches(...)
la définition d'une fonction qui fait tout ce que votre script n', puis de le faireif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
à la fin du fichier.Ma solution est entrypoint2. Exemple:
texte d'aide: