Si vous souhaitez créer une sorte de commande (CLI), vous utilisez argparse. Voici quelques conseils sur la façon d'utiliser cet argument de manière confortable et pratique avec le moins d'effort possible.
sys.argv
Dans certaines introductions à l'utilisation d'argparse, je passe sérieusement sys.argv
. Tu n'as pas besoin. Appeler parse_args ()
sans argument fera très bien l'affaire.
import argparse
parser = argparse.ArgumentParser()
parser.parse_args() #C'est acceptable
Si vous ajoutez -h
ou --help
, argparse ajoutera automatiquement la fonction pour afficher le message d'aide. En plus de cela, il est pratique de quitter le comportement lorsque vous faites une erreur dans l'utilisation de argparse.
Vous n'avez pas besoin d'écrire ce type de code, par exemple, si vous l'exécutez sans argument.
import sys
#Ce code est inutile
if len(sys.argv) == 0:
parser.parse_args(["-h"])
Je voulais juste vous dire que ce n'est pas nécessaire car il y avait tellement de bonnes choses dans cet article.
Post-scriptum:
Il semble que l'intention de ce code était de donner une aide longue au lieu d'un message d'utilisation court en cas d'erreur. C'est un peu hacky, mais vous pouvez l'écrire comme ça (bien que certaines personnes préfèrent le code original, qui montre clairement ce qui se passe):
parser.print_usage = parser.print_help
Si vous spécifiez ne serait-ce qu'un seul argument de position, vous n'avez rien à faire car le manque d'arguments est automatiquement vérifié.
import argparse
parser = argparse.ArgumentParser("<command name>")
parser.add_argument("file") # positional argument
args = parser.parse_args()
$ python cmd.py
usage: <command name> [-h] file
<command name>: error: the following arguments are required: file
Si tout était facultatif, ajoutez required = True
à ce qui semble être requis (bien qu'il soit question d'un argument positionnel si nécessaire).
import argparse
parser = argparse.ArgumentParser("<command name>")
parser.add_argument("--file", required=True)
args = parser.parse_args()
$ python cmd.py
usage: <command name> [-h] --file FILE
<command name>: error: the following arguments are required: file
Un autre comportement possible est quand il est exécuté sans spécifier d'arguments. Il s'agit de traiter en incorporant la valeur par défaut. Cela peut être spécifié avec default
.
Par exemple, vous souhaiterez peut-être créer une commande qui reçoit des données d'une entrée standard si vous ne spécifiez pas de fichier.
Si spécifié dans un argument positionnel, utilisez nargs ="? "
Pour le rendre facultatif
import sys
import argparse
parser = argparse.ArgumentParser("hai")
parser.add_argument("file", nargs="?", type=argparse.FileType("r"), default=sys.stdin)
args = parser.parse_args()
print(args.file.read())
Cela fonctionnera.
$ cat hello.txt | python echo.py
$ python echo.py hello.txt
Pour les arguments facultatifs, spécifiez simplement default.
parser.add_argument("--file", type=argparse.FileType("r"), default=sys.stdin)
Il est utile de se souvenir de l'action reçue par add_argument de l'analyseur. Vous n'avez pas à vous souvenir de tout, mais il est plus facile de se souvenir de certaines actions.
Par exemple, utilisez store_true lorsque vous avez un indicateur comme --with- <quelque chose>
ou une option qui ne prend pas d'argument comme --debug
. la valeur par défaut sera False
parser.add_argument("--debug", action="store_true")
Inversement, utilisez store_false si l'indicateur est --without- <quelque chose>
, ou si la valeur par défaut est définie sur True et l'option est définie sur False.
parser.add_argument("--execute", action="store_false") #la valeur par défaut est sèche-Situation comme courir
Notez que si vous souhaitez fournir à la fois les indicateurs with-foo
et without-foo
, vous devez spécifier les valeurs par défaut avec set_defaults (). Sinon, la valeur par défaut dépendra de l'ordre dans lequel vous l'avez écrite.
#la valeur par défaut est le débogage=False
parser.add_argument("--without-debug", action="store_false", dest="debug")
parser.add_argument("--with-debug", action="store_true", dest="debug")
parser.set_defaults(debug=False)
Si vous souhaitez prendre plusieurs valeurs, spécifiez ajouter pour action.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--target", action="append")
args = parser.parse_args()
print(args)
Cela fonctionne comme suit.
$ python cmd.py --target x --target y --target z
Namespace(target=['x', 'y', 'z'])
Si vous souhaitez limiter la plage de valeurs possibles, il est pratique d'utiliser des choix. Par exemple, la partie qui spécifie le niveau de journalisation doit être écrite comme suit.
import argparse
import logging
parser = argparse.ArgumentParser()
loglevels = list(logging._nameToLevel.keys()) # _C'est un préfixe, donc il ne se comporte pas correctement.
parser.add_argument("--loglevel", choices=loglevels, default="INFO")
args = parser.parse_args()
logging.basicConfig(level=args.loglevel)
logger = logging.getLogger("log")
logger.debug("hmm..")
logger.info("hmm")
Je pense que les informations sont bonnes par défaut.
$ python cmd.py
INFO:log:hmm
$ python cmd.py -h
usage: cmd.py [-h]
[--loglevel {WARN,INFO,NOTSET,DEBUG,CRITICAL,WARNING,ERROR}]
optional arguments:
-h, --help show this help message and exit
--loglevel {WARN,INFO,NOTSET,DEBUG,CRITICAL,WARNING,ERROR}
$ python cmd.py --loglevel=DEBUG
DEBUG:log:hmm..
INFO:log:hmm
Il est plus utile de regarder le document officiel que de lire cet article car l'explication du document officiel est utile en détail. Voir la documentation officielle.
Si vous voulez créer une sous-commande, abandonnez tôt argparse et utilisez click.
Après cela, il est utile de se souvenir d'un paquet qui peut être exécuté en tant que commande à partir de la définition de la fonction (je l'ai fait moi-même).
Par exemple, c'est comme suit.
# greeting.py
from handofcats import as_command
@as_command
def greeting(message, is_surprised=False, name="foo"):
suffix = "!" if is_surprised else ""
print("{name}: {message}{suffix}".format(name=name, message=message, suffix=suffix))
$ pip install handofcats
$ python greeting.py -h
python greeting.py -h
usage: greeting.py [-h] [--is-surprised] [--name NAME] [-v] [-q] message
positional arguments:
message
optional arguments:
-h, --help show this help message and exit
--is-surprised
--name NAME
-v, --verbose (default option: increment logging level(default is
WARNING))
-q, --quiet (default option: decrement logging level(default is
WARNING))
$ python greeting.py
foo: hello
$ python greeting.py --is-surprised --name me hello
me: hello!