web-dev-qa-db-fra.com

Lecture des arguments des commandes nommées

Puis-je utiliser argparse pour lire les arguments de ligne de commande nommés qui n'ont pas besoin d'être dans un ordre spécifique? J'ai parcouru le documentation mais la plupart se concentrait sur l'affichage du contenu en fonction des arguments fournis (tels que --h).

En ce moment, mon script lit des arguments ordonnés et sans nom:

myscript.py foo-val bar-val

en utilisant sys.argv:

foo = sys.argv[1]
bar = sys.argv[2]

Mais je voudrais changer l'entrée afin qu'elle soit agnostique par ordre en nommant les arguments:

myscript.py --bar = bar-val --foo = foo-val

33
amphibient

Vous pouvez utiliser Arguments facultatifs comme ceci:

import argparse, sys

parser=argparse.ArgumentParser()

parser.add_argument('--bar', help='Do the bar option')
parser.add_argument('--foo', help='Foo the program')

args=parser.parse_args()

print args
print sys

Ensuite, si vous l'appelez avec ./prog --bar=bar-val --foo foo-val il imprime:

Namespace(bar='bar-val', foo='foo-val')
['Untitled 14.py', '--bar=bar-val', '--foo', 'foo-val']

Ou, si l'utilisateur veut de l'aide, argparse le construit aussi:

 $ ./prog -h
usage: Untitled 14.py [-h] [--bar BAR] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --bar BAR   Do the bar option
  --foo FOO   Foo the program
42
dawg

La réponse est oui . Un rapide coup d'œil à la documentation argparse aurait également répondu.

Voici un exemple très simple, argparse est capable de gérer des besoins bien plus spécifiques.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', '-f', help="a random options", type= str)
parser.add_argument('--bar', '-b', help="a more random option", type= int, default= 0)

print(parser.format_help())
# usage: test_args_4.py [-h] [--foo FOO] [--bar BAR]
# 
# optional arguments:
#   -h, --help         show this help message and exit
#   --foo FOO, -f FOO  a random options
#   --bar BAR, -b BAR  a more random option

args = parser.parse_args("--foo pouet".split())
print(args)  # Namespace(bar=0, foo='pouet')
print(args.foo) # pouet
print(args.bar) # 0

Bien sûr, dans un vrai script, vous ne coderez pas en dur les options de ligne de commande et appellerez à la place parser.parse_args() (sans argument). Cela fera argparse prendre la liste sys.args Comme arguments de ligne de commande.

Vous pourrez appeler ce script de cette façon:

test_args_4.py -h  # prints the help message
test_args_4.py -f pouet  # foo="pouet", bar=0 (default value)
test_args_4.py -b 42  # foo=None, bar=42
test_args_4.py -b 77 -f knock  # foo="knock", bar=77

Vous découvrirez de nombreuses autres fonctionnalités en lisant la doc;)

15
Tryph