La documentation du module python argparse , bien qu'excellente, j'en suis sûr, est trop pour mon petit cerveau de débutant à saisir en ce moment. Je n'ai pas besoin de faire des calculs sur la ligne de commande ou de me mêler des lignes de formatage à l'écran ou de changer les caractères des options. Tout ce que je veux faire est "Si arg est A, faites ceci, si B fait cela, si aucune des réponses ci-dessus ne montre de l'aide et quittez" .
529
sys.argv
l'argument que vous voulez ...Réponses:
Ma compréhension de la question d'origine est double. Tout d'abord, en termes d'exemple d'argparse le plus simple possible, je suis surpris de ne pas l'avoir vu ici. Bien sûr, pour être très simple, tout cela est également une surcharge avec peu de puissance, mais cela pourrait vous aider à démarrer.
Mais cet argument positionnel est désormais requis. Si vous l'omettez lors de l'appel de ce programme, vous obtiendrez une erreur sur les arguments manquants. Cela m'amène à la deuxième partie de la question d'origine. Matt Wilkie semble vouloir un seul argument facultatif sans étiquette nommée (les étiquettes --option). Ma suggestion serait de modifier le code ci-dessus comme suit:
Il peut bien y avoir une solution plus élégante, mais cela fonctionne et est minimaliste.
la source
Voici comment je le fais
argparse
(avec plusieurs arguments):args
sera un dictionnaire contenant les arguments:Dans votre cas, ajoutez simplement un seul argument.
la source
foo.py --action install
oufoo.py --action remove
au lieu de simplementfoo.py install
parser.add_argument('install', help='Install the app')
(Remarquez que vous ne pouvez pas définir un argument positionnel avecrequired=True
)args
dict était généré comme ci-dessus.args.foo
et à laargs.bar
place de la syntaxe du dictionnaire. Quoi qu'il en soit, bien sûr, mais args n'est pas en fait un dictionnaire mais unargparse.Namespace
objet.La
argparse
documentation est raisonnablement bonne mais laisse de côté quelques détails utiles qui pourraient ne pas être évidents. (@Diego Navarro a déjà mentionné une partie de cela, mais je vais essayer de développer légèrement sa réponse.) L'utilisation de base est la suivante:L'objet dont vous récupérez
parse_args()
est un objet 'Namespace': un objet dont les variables membres sont nommées d'après vos arguments de ligne de commande. L'Namespace
objet est la façon dont vous accédez à vos arguments et aux valeurs qui leur sont associées:(Notez que
argparse
remplace «-» dans vos noms d'argument par des traits de soulignement lors du nommage des variables.)Dans de nombreuses situations, vous souhaiterez peut-être utiliser des arguments simplement comme des indicateurs qui ne prennent aucune valeur. Vous pouvez ajouter ceux-ci dans argparse comme ceci:
Ce qui précède créera des variables nommées 'foo' avec la valeur True et 'no_foo' avec la valeur False, respectivement:
Notez également que vous pouvez utiliser l'option "requis" lors de l'ajout d'un argument:
De cette façon, si vous omettez cet argument sur la ligne de commande,
argparse
il vous dira qu'il est manquant et arrêtera l'exécution de votre script.Enfin, notez qu'il est possible de créer une structure de dict de vos arguments en utilisant la
vars
fonction, si cela vous facilite la vie.Comme vous pouvez le voir,
vars
renvoie un dict avec vos noms d'argument sous forme de clés et leurs valeurs sous forme de valeurs.Il existe de nombreuses autres options et choses que vous pouvez faire, mais cela devrait couvrir les scénarios d'utilisation courants les plus essentiels.
la source
'-f'
et'-b'
? Pourquoi ne pouvez-vous pas omettre cela?man cp
ouman ls
et vous constaterez que de nombreuses options sont disponibles dans les deux versions (par exemple-f, --force
). Il y a probablement des raisons très différentes pour lesquelles les gens préfèrent l'un ou l'autre, mais dans tous les cas, il est assez courant de rendre les deux formulaires disponibles dans votre programme.Matt pose des questions sur les paramètres de position dans argparse, et je conviens que la documentation Python manque sur cet aspect. Il n'y a pas un seul exemple complet dans les ~ 20 pages impaires qui montre à la fois l' analyse et l'utilisation des paramètres de position .
Aucune des autres réponses ici ne montre non plus un exemple complet de paramètres de position, alors voici un exemple complet:
Ce qui m'a dérouté, c'est que argparse convertira l'argument nommé "--foo-bar" en "foo_bar", mais un paramètre de position nommé "foo-bar" reste comme "foo-bar", ce qui rend moins évident la façon de utilisez-le dans votre programme.
Remarquez les deux lignes vers la fin de mon exemple - aucune de celles-ci ne fonctionnera pour obtenir la valeur du paramètre de position foo-bar. Le premier est évidemment faux (c'est une expression arithmétique args.foo minus bar), mais le second ne fonctionne pas non plus:
Si vous souhaitez utiliser l'
foo-bar
attribut, vous devez utilisergetattr
, comme on le voit dans la dernière ligne de mon exemple. Ce qui est fou, c'est que si vous essayez d'utiliserdest=foo_bar
pour changer le nom de la propriété en quelque chose de plus facile d'accès, vous obtiendrez un message d'erreur vraiment bizarre:Voici comment fonctionne l'exemple ci-dessus:
la source
nargs='?'
est l'incantation d'un "positionnel optionnel" selon stackoverflow.com/questions/4480075/…foo-bar
ne soit pas transformé enfoo_bar
est traité dans bugs.python.org/issue15125 .print args.foo_bar
fonctionne. Comme il s'agit d'un argument positionnel, vous n'avez pas besoin de spécifier le nom lors de l'appel du script, donc cela n'a pas d'importance pour l'utilisateur.getattr
(il est également plus flexible car il vous permet de changer un argument de facultatif en positionnel sans avoir à changer le code qui utilise la valeur).Encore une autre introduction sommaire, inspirée de ce post .
Les arguments sont définis avec des combinaisons des éléments suivants:
Les options courantes sont:
--help
est utilisé.float
ouint
(sinon c'est le casstr
).'-x', '--long-name', dest='longName'
).Remarque: par défaut
--long-name
est accessible avecargs.long_name
store_true, store_false
: pour les arguments booléens'--foo', action='store_true' => args.foo == True
store_const
: à utiliser avec optionconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: pour les options répétées, comme dans./myscript.py -vv
'-v', action='count' => args.v == 2
append
: pour les options répétées, comme dans./myscript.py --foo 1 --foo 2
'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
).la source
Notez le Tutoriel Argparse dans les HOWTO Python . Il part de la plupart des exemples de base, comme celui-ci:
et progresse vers les moins basiques.
Il y a un exemple avec un choix prédéfini pour une option, comme ce qui est demandé:
la source
Voici ce que j'ai trouvé dans mon projet d'apprentissage grâce principalement à @DMH ...
Code de démonstration:
Cela peut avoir évolué et est disponible en ligne: command-line.py
Script pour donner un entraînement à ce code: command-line-demo.sh
la source
Vous pouvez également utiliser plac (un wrapper autour
argparse
).En prime, il génère des instructions d'aide soignées - voir ci-dessous.
Exemple de script:
Exemple de sortie:
Aucun argument fourni -
example.py
:Argument inattendu fourni -
example.py C
:Argument correct fourni -
example.py A
:Menu d'aide complet (généré automatiquement) -
example.py -h
:Brève explication:
Le nom de l'argument est généralement égal au nom du paramètre (
arg
).L'annotation de tuple après le
arg
paramètre a la signification suivante:Argument with two possible values
)positional
)None
)None
)['A', 'B']
)Documentation:
Pour en savoir plus sur l'utilisation de plac, consultez sa superbe documentation:
la source
Pour ajouter à ce que d'autres ont déclaré:
J'aime généralement utiliser le paramètre «dest» pour spécifier un nom de variable, puis utiliser «globals (). Update ()» pour placer ces variables dans l'espace de noms global.
Usage:
Code:
la source
argparse
Utilise en internegetattr
etsetattr
pour accéder aux valeurs dans l'espace de noms. De cette façon, il n'est pas gêné par desdest
valeurs étrangement formées .Un moyen très simple d'utiliser argparse et de modifier les commutateurs '-h' / '--help' pour afficher vos propres instructions d'aide sur le code personnel consiste à définir l'aide par défaut sur False, vous pouvez également ajouter autant de .add_arguments supplémentaires que vous le souhaitez. :
Exécutez: python test.py -h
Production:
la source
La réponse la plus simple!
PS celui qui a écrit le document d'argparse est idiot
code python:
code en cours d'exécution
la source