module argparse Comment ajouter une option sans aucun argument?

165

J'ai créé un script en utilisant argparse.

Le script doit prendre un nom de fichier de configuration en option, et l'utilisateur peut spécifier s'il doit poursuivre totalement le script ou seulement le simuler.

Les arguments à passer: ./script -f config_file -sou ./script -f config_file.

C'est ok pour la partie -f config_file, mais elle me demande des arguments pour le -s qui est optionnel et ne doit être suivi d'aucun.

J'ai essayé ceci:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file')
#parser.add_argument('-s', '--simulate', nargs = '0')
args = parser.parse_args()
if args.file:
    config_file = args.file
if args.set_in_prod:
        simulate = True
else:
    pass

Avec les erreurs suivantes:

File "/usr/local/lib/python2.6/dist-packages/argparse.py", line 2169, in _get_nargs_pattern
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
TypeError: can't multiply sequence by non-int of type 'str'

Et même erreur avec ''au lieu de 0.

Philippe
la source

Réponses:

233

Comme @Felix Kling l'a suggéré, utilisez action='store_true':

>>> from argparse import ArgumentParser
>>> p = ArgumentParser()
>>> _ = p.add_argument('-f', '--foo', action='store_true')
>>> args = p.parse_args()
>>> args.foo
False
>>> args = p.parse_args(['-f'])
>>> args.foo
True
jfs
la source
97

Pour créer une option qui n'a besoin d'aucune valeur, définissez la action [docs] de celle-ci sur 'store_const', 'store_true'ou 'store_false'.

Exemple:

parser.add_argument('-s', '--simulate', action='store_true')
Félix Kling
la source
Bonjour, merci pour votre réponse. J'ai essayé comme expliqué dans la doc: >>> parser.add_argument ('- foo', '-f', action = 'store_true') _StoreTrueAction (option_strings = ['- foo', '-f'], dest = 'foo', nargs = 0, const = True, default = False, type = None, choice = None, help = None, metavar = None) >>> parser.parse_args () Namespace (foo = False) >> > print args.foo Traceback (dernier appel en dernier): Fichier "<stdin>", ligne 1, dans <module> AttributeError: L'objet 'Namespace' n'a pas d'attribut 'foo' >>> `Cela ne semble pas fonctionner; Je ne sais pas comment récupérer la valeur après l'attribution. Merci de m'avoir aidé!
philippe
@philippe: vous avez oublié de lier la parser.parse_args()valeur renvoyée à args stackoverflow.com/questions/5262702
...
@philippe: args = parser.parse_args()comme vous l'avez déjà dans votre code. Il vous suffit de remplacer la ligne commentée, puis vous pouvez accéder à la valeur avec args.simulate.
Felix Kling