Indicateurs de ligne de commande Python argparse sans arguments

345

Comment ajouter un indicateur facultatif à mes arguments de ligne de commande?

par exemple. donc je peux écrire

python myprog.py 

ou

python myprog.py -w

j'ai essayé

parser.add_argument('-w')

Mais je reçois juste un message d'erreur disant

Usage [-w W]
error: argument -w: expected one argument

que je suppose, cela signifie qu'il veut une valeur d'argument pour l'option -w. Comment accepter simplement un drapeau?

Je trouve http://docs.python.org/library/argparse.html plutôt opaque sur cette question.

interstar
la source
4
Si vous voulez juste un indicateur pour votre script, sys.argv serait beaucoup plus facile. À moins que vous n'essayiez spécifiquement d'apprendre l'argparse, ce qui est bien car c'est un module pratique à savoir.
chown
2
Même après avoir connu la réponse, je ne vois pas comment j'aurais pu la comprendre à partir de la documentation.
Andreas Haferburg

Réponses:

532

Comme vous l'avez, l'argument w attend une valeur après -w sur la ligne de commande. Si vous cherchez simplement à basculer un commutateur en définissant une variable Trueou False, consultez http://docs.python.org/dev/library/argparse.html#action (spécifiquement store_true et store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

action='store_true'implique default=False.

À l'inverse, vous pourriez avoir action='store_false', ce qui implique default=True.

Jdog
la source
3
@Jdog, une idée de pourquoi cela ne fonctionne pas pour moi? C'est wtoujours False.
Iulian Onofrei
52

Ajout d'un extrait rapide pour qu'il soit prêt à être exécuté:

Source: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

Usage:

python myparser.py -w
>> True
user1767754
la source
-10

Voici un moyen rapide de le faire, ne nécessitera rien de plus sys.. bien que la fonctionnalité soit limitée:

flag = "--flag" in sys.argv[1:]

[1:] est dans le cas où le nom de fichier complet est --flag

dbalagula23
la source
13
Connectez-vous simplement pour exprimer à quel point cette idée est mauvaise à long terme. Imaginez que vous commenciez par vérifier si la chaîne "--flag" est dans sys.argv. Ensuite, vous regardez à la fin de sys.argv [-1] pour voir quel fichier ouvrir. Tout à coup, vous vous retrouvez avec une situation où si vous essayez d'ouvrir un fichier nommé --flag, il se comportera de manière inattendue, et ce qui est pire, c'est que cela finit souvent par être un défaut de sécurité sur la route, lorsque des données non fiables finissent par être passé à argv. En fin de compte, cette méthode ne devrait tout simplement pas être effectuée. Les vrais analyseurs d'arguments sont juste beaucoup plus robustes ...
timthelion
3
Comme mentionné, cette solution n'est pas du tout robuste, mais elle fonctionne si vous en avez besoin très rapidement (par exemple à des fins de test). Gardez-le définitivement à l'écart du code de production.
Jonathan Sudiaman