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?

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.


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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.