[PYTHON] Présentation de l'utilisation d'argparse pour les personnes décontractées avec le moins d'effort possible

introduction

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.

Pas besoin de passer 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

Laisser argparse gérer l'affichage des messages d'aide

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

Pour l'argument positionnel

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

Pour l'option

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

Facilitons les choses en spécifiant les arguments par défaut

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.

Pour l'argument positionnel

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 l'option

Pour les arguments facultatifs, spécifiez simplement default.

parser.add_argument("--file", type=argparse.FileType("r"), default=sys.stdin)

Facilitons les choses avec l'action

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.

L'argument d'option est store_true / store_false

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)

Ajouter si vous souhaitez transmettre plusieurs valeurs pour la même option

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'])

Utilisez des choix si vous souhaitez limiter la plage de valeurs possibles

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

Lire la documentation argparse

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.

prime

Sous-commande

Si vous voulez créer une sous-commande, abandonnez tôt argparse et utilisez click.

Convertir la définition de fonction en commande

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!

Recommended Posts

Présentation de l'utilisation d'argparse pour les personnes décontractées avec le moins d'effort possible
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
Pour ceux qui veulent afficher les images côte à côte dès que possible avec matplotlib de Python
Comment utiliser Python Argparse
Les personnes familiarisées avec les programmes Android essaient le traitement multi-thread avec Python
Liens vers des personnes qui commencent tout juste l'analyse de données avec python
Comment utiliser un éditeur externe pour le développement Python avec Grasshopper
Python: comment utiliser async avec
Pour utiliser virtualenv avec PowerShell
Commençons avec Python 3. ~ Pour les chatons qui se demandent quoi choisir comme langue principale ~
Comment rendre le sélénium aussi léger que possible
Comment utiliser ManyToManyField avec l'administrateur de Django
Comment utiliser OpenVPN avec Ubuntu 18.04.3 LTS
Comment utiliser Cmder avec PyCharm (Windows)
Comment utiliser Ass / Alembic avec HtoA
Comment utiliser le japonais avec le tracé NLTK
[Python] Organisation de l'utilisation des instructions
Comment utiliser le notebook Jupyter avec ABCI
Comment utiliser la commande CUT (avec exemple)
Comment utiliser "deque" pour les données Python
Comment utiliser l'authentification par empreinte digitale pour KDE
Comment utiliser SQLAlchemy / Connect avec aiomysql
Comment utiliser le pilote JDBC avec Redash
Comment utiliser OAuth et API de compte de service avec le client API Google pour python