Наличие опций в argparse с тире

Я хочу иметь некоторые параметры в модуле argparse, такие как --pm-export однако, когда я пытаюсь использовать его как args.pm-export я получаю сообщение об ошибке, что нет атрибута pm. Как я могу обойти эту проблему? Возможно ли иметь - в параметрах командной строки?

Ответ 1

Как указанный в argparse docs:

Для дополнительных действий с аргументами значение dest обычно выводится из строк опций. ArgumentParser генерирует значение dest, беря первую длинную строку опций и удаляя начальную строку --. Любые внутренние символы - будут преобразованы в символы _, чтобы убедиться, что строка является допустимым именем атрибута

Итак, вы должны использовать args.pm_export.

Ответ 2

К сожалению, замена тире-под-подчеркиванием не работает для позиционных операций (без префикса --), например

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

Итак, вы должны использовать 1-й аргумент для add_argument() как имя атрибута и metavar kwarg, чтобы установить, как он должен выглядеть в справке:

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

Ответ 3

Черточки преобразуются в символы подчеркивания:

import argparse
pa = argparse.ArgumentParser()
pa.add_argument('--foo-bar')
args = pa.parse_args(['--foo-bar', '24'])
print args # Namespace(foo_bar='24')

Ответ 4

Если у вас есть скрипт на python, который должен делегировать аргументы CLI и выбрать его, то получает приложение Java CLI. Имена опций одинаковы в приложениях Python и Java.

Проблема в том, что некоторые из этих опций содержат тире. В результате, когда я составляю командную строку Java для выполнения, эти аргументы заканчиваются подчеркиванием вместо черточки, которое затем отклоняется приложением Java.

Например, командная строка:

add --web-query = "котировки акций" --corpus = "цитаты"

заканчивается пересылкой в приложение Java как:

add --web_query = "котировки акций" --corpus = "котировки"

которое отклоняет приложение Java.

Могу ли я узнать, какое ОРИГИНАЛЬНОЕ имя опции было в командной строке, которая была проанализирована?

Я всегда могу просто заменить подчеркивание дефисами, но что если оригинальное имя опции DID содержит дефис?

Любая помощь будет оценена.

Спасибо.

Alain