Avoir des options dans argparse avec un tiret

154

Je veux avoir des options dans le module argparse, comme --pm-exportcependant lorsque j'essaye de l'utiliser comme args.pm-exportsi j'obtenais l'erreur qu'il n'y a pas d'attribut pm. Comment contourner ce problème? Est-il possible d'avoir des -options en ligne de commande?

Cemre
la source

Réponses:

226

Comme indiqué dans la argparsedocumentation :

Pour les actions d'argument facultatives, la valeur de dest est normalement déduite des chaînes d'options. ArgumentParser génère la valeur de dest en prenant la première longue chaîne d'options et en supprimant la --chaîne initiale . Tous les -caractères internes seront convertis en _caractères pour s'assurer que la chaîne est un nom d'attribut valide

Vous devriez donc utiliser args.pm_export.

Thomas Orozco
la source
108

Malheureusement, le remplacement d'un tiret par un trait de soulignement ne fonctionne pas pour les arguments de position (non préfixés par --) comme

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs-dir',
                    help='Directory with .log and .log.gz files')
parser.add_argument('results-csv', type=argparse.FileType('w'),
                    default=sys.stdout,
                    help='Output .csv filename')
args = parser.parse_args()
print args

# gives
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>)

Vous devez donc utiliser le 1er argument add_argument()comme nom d'attribut et metavarkwarg pour définir à quoi il doit ressembler dans l'aide:

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs_dir', metavar='logs-dir',
                    nargs=1,
                    help='Directory with .log and .log.gz files')
parser.add_argument('results_csv', metavar='results-csv',
                    nargs=1,
                    type=argparse.FileType('w'),
                    default=sys.stdout,
                    help='Output .csv filename')
args = parser.parse_args()
print args

# gives
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>])
seriyPS
la source
7
Le rapport de bogue Python pertinent: bugs.python.org/issue15125 . argparseutilise setattret getattr, donc les destnoms ne doivent pas nécessairement être des dotnoms d'attributs valides . L'utilisateur peut également utiliser getattr.
hpaulj
5
Je ferais justepositional_arg = getattr( parser, 'positional-arg' )
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Exactement ce dont j'avais besoin - je l'ai fait à l'envers metavaret je ne pouvais pas comprendre pourquoi cela ne fonctionnait pas. Merci!
dwanderson
17

Les tirets sont convertis en traits de soulignement:

import argparse
pa = argparse.ArgumentParser()
pa.add_argument('--foo-bar')
args = pa.parse_args(['--foo-bar', '24'])
print args # Namespace(foo_bar='24')
Georg
la source
4
Uniquement pour les arguments optionnels. Obligatoires pour conserver leurs traits d'union, il faut donc un trait de soulignement pour les rendre accessibles.
n00dle