Je suis à l'origine un programmeur C. J'ai vu de nombreuses astuces et "hacks" pour lire de nombreux arguments différents.
De quelles manières les programmeurs Python peuvent-ils procéder?
en relation
- Quelle est la meilleure façon de récupérer / analyser les arguments de ligne de commande passés à un script Python?
- Implémenter des interfaces de ligne de commande de style «[commande] [action] [paramètre]»?
- Comment puis-je traiter des arguments de ligne de commande en Python?
- Comment puis-je formater l'aide à l'argument positionnel à l'aide de l'optparse de Python?
python
command-line
command-line-arguments
martineau
la source
la source
Réponses:
La solution canonique dans la bibliothèque standard est
argparse
( docs ):Voici un exemple:
argparse
soutient (entre autres):la source
optparse
est obsolète, le demandeur de la question n'est plus membre sur le débordement de pile, et c'est la réponse acceptée sur une question très visible - veuillez envisager de réécrire complètement votre exemple de code pour utiliser stdlib à laargparse
place.sys.argv
est une liste qui contient tous les arguments passés au script sur la ligne de commande.Fondamentalement,
la source
sys.argv[1:]
(évite le nom du script).Faire le tour de l'évangélisation pour argparse, ce qui est mieux pour ces raisons .. essentiellement:
(copié à partir du lien)
Le module argparse peut gérer les arguments positionnels et optionnels, tandis que optparse ne peut gérer que les arguments optionnels
argparse n'est pas dogmatique sur ce à quoi devrait ressembler votre interface de ligne de commande - les options comme -file ou / file sont prises en charge, tout comme les options requises. Optparse refuse de prendre en charge ces fonctionnalités, préférant la pureté à la praticité
argparse produit des messages d'utilisation plus informatifs, y compris l'utilisation de la ligne de commande déterminée à partir de vos arguments, et des messages d'aide pour les arguments positionnels et facultatifs. Le module optparse vous oblige à écrire votre propre chaîne d'utilisation et n'a aucun moyen d'afficher l'aide pour les arguments positionnels.
argparse prend en charge les actions qui consomment un nombre variable d'arguments de ligne de commande, tandis qu'optparse requiert que le nombre exact d'arguments (par exemple 1, 2 ou 3) soit connu à l'avance.
argparse prend en charge les analyseurs qui expédient vers les sous-commandes, tandis qu'optparse nécessite de définir
allow_interspersed_args
et d'effectuer la répartition de l'analyseur manuellementEt mon préféré:
add_argument()
avec de simples callables, tandis qu'optparse nécessite le piratage d'attributs de classe commeSTORE_ACTIONS
ouCHECK_METHODS
pour obtenir une vérification correcte des argumentsla source
-f
ou--foo
, tandis que "le nombre exact d'arguments connus à l'avance" signifie probablement des arguments positionnels donnés sans aucun indicateur d'option précédent.Il y a aussi le
argparse
module stdlib (une "amélioration" sur leoptparse
module stdlib ). Exemple d' introduction à argparse :Usage:
la source
Une façon de le faire consiste à utiliser
sys.argv
. Cela affichera le nom du script comme premier argument et tous les autres paramètres que vous lui passerez.la source
La bibliothèque docopt est vraiment épurée . Il construit un argument argument à partir de la chaîne d'utilisation de votre application.
Par exemple, dans le fichier Lisezmoi de docopt:
la source
Si vous avez besoin de quelque chose de rapide et pas très flexible
main.py:
Ensuite, exécutez
python main.py James Smith
pour produire la sortie suivante:
la source
python main.py "James Smith"
qui metJames Smith
ensys.argv[1]
et produit unIndexError
lorsque vous essayez d'utiliser l'inexistantsys.argv[2]
. Le comportement des citations dépendra quelque peu de la plateforme et du shell à partir desquels vous exécutez Python.python main.py "James Joseph Smith"
? Si vous êtes concerné par l'index hors limites, vous pouvez ajouter une vérification du nombre d'arguments fournis. Moins réaliste ou pas, mon exemple montre comment gérer plusieurs arguments.gmail-trash-msg.py MessageID
. Cette réponse est simple pour tester leMessageID
paramètre a été transmissys.argv[1]
.la source
J'utilise optparse moi-même, mais j'aime vraiment la direction que prend Simon Willison avec sa bibliothèque optfunc récemment introduite . Il fonctionne par:
Ainsi, par exemple, cette définition de fonction:
est transformé en ce texte d'aide optparse:
la source
J'aime getopt de stdlib, par exemple:
Dernièrement, j'ai enveloppé quelque chose de similaire à cela pour rendre les choses moins verbeuses (par exemple, rendre "-h" implicite).
la source
De Pocoo click est plus intuitif, nécessite moins de passe-partout et est au moins aussi puissant que l'argparse.
La seule faiblesse que j'ai rencontrée jusqu'à présent est que vous ne pouvez pas faire beaucoup de personnalisation pour aider les pages, mais ce n'est généralement pas une exigence et docopt semble être le choix clair quand il l'est.
la source
Comme vous pouvez le voir optparse "Le module optparse est obsolète et ne sera pas développé davantage; le développement se poursuivra avec le module argparse ."
la source
la source
Vous pourriez être intéressé par un petit module Python que j'ai écrit pour rendre la gestion des arguments de ligne de commande encore plus facile (open source et gratuit à utiliser) - Commando
la source
Je recommande de regarder docopt comme une alternative simple à ces autres.
docopt est un nouveau projet qui fonctionne en analysant votre message d'utilisation --help plutôt qu'en vous obligeant à tout implémenter vous-même. Il vous suffit de mettre votre message d'utilisation au format POSIX.
la source
Pourtant, une autre option est argh . Il s'appuie sur argparse et vous permet d'écrire des choses comme:
Il générera automatiquement de l'aide, etc., et vous pouvez utiliser des décorateurs pour fournir des conseils supplémentaires sur la façon dont l'analyse d'arg doit fonctionner.
la source
argh
est plus facile qu'une autre bibliothèque ou l'utilisationsys
.argh
mais ce n'est pas particulièrement adapté aux scénarios où votre plus grand désir n'est pas d'avoir une commande avec des sous-commandes.def frobnicate_spleches(...)
définir une fonction qui fait ce que fait votre script, puis de le faireif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
à la fin du fichier.Ma solution est entrypoint2 . Exemple:
Texte d'aide:
la source