Аргумент Python ігнорує нерозпізнані аргументи


206

Optparse, стара версія просто ігнорує всі нерозпізнані аргументи і продовжує. У більшості ситуацій це не ідеально і змінювалося в аргументації. Але є кілька ситуацій, коли ви хочете ігнорувати нерозпізнані аргументи та аналізувати вказані вами.

Наприклад:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

Чи все-таки це потрібно перезаписати?


14
Дуже зручно, якщо ви пишете обгортку для іншої програми, і ви хочете зафіксувати та змінити кілька аргументів, але інше передайте!
Алан Де Смет

2
Саме тому я і опинився тут @AlanDeSmet! Рада, що я не намагаюся зробити щось божевільне :)
dwanderson

Відповіді:


351

Замініть

args = parser.parse_args()

з

args, unknown = parser.parse_known_args()

Наприклад,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']

21
+1 - не знав, що є щось на кшталтparse_known_args
avasal

7
Ні я! Я навіть пропустив це в docs.python.org/library/… . Спасибі
joedborg

1
Це з'явилося, коли я намагався використовувати носовий тест з аналізаторами (він відмовився дозволити використовувати аргументи з носом), тому що я робив це, parser.parse_args(None)а не parser.parse_args([])на своїх тестах.
Енді Хейден

3
FWIW, використовуючи, parse_known_argsа не parse_argsдозволяє використовувати ArgumentParserкод у межах if __name__ == 'main':(умова, що Trueстосується всіх комірок у ноутбуці IPython ..., що я знаходжу в значній мірі сприяє розробці та тестуванню коду, який я хочу врешті-решт перенести на скрипт, на який посилається з командного рядка)
gumption

1
Схоже, це не працює з необов'язковими аргументами, які "відомі" не передаються.
Шаруд,

21

Ви можете поставити решту частин в новий аргумент, parser.add_argument('args', nargs=argparse.REMAINDER)якщо ви хочете їх використовувати.


1
Це працює з parse_args()і не вимагає parse_known_args()(на Python 2.7).
OozeMeister

4
Використання argparse.REMAINDER, здається, загрожує давніми помилками. Я, звичайно, не можу змусити його працювати. parse_known_args () - хороша альтернатива.
Метт

1
Щойно натрапив на давню помилку REMAINDER сьогодні: bugs.python.org/issue17050
Скотт Карпентер

7

Насправді аргументація все ще "ігнорується" _unrecognized_args. Поки ці нерозпізнані аргументи не використовують префікс за замовчуванням, ви не почуєте жодних скарг від аналізатора.

Використовуючи конфігурацію @ anutbu, але зі стандартною parse.parse_args(), якщо ми повинні виконати нашу програму з наступними аргументами.

$ program --foo BAR a b +cd e

У нас буде цей збір даних в просторі імен.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

Якщо ми хотіли, щоб префікс за замовчуванням був -проігнорований, ми могли б змінити ArgumentParser і вирішити, що ми будемо використовувати +аргументи для наших "розпізнаних" аргументів.

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

Та сама команда виробляє

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

Покладіть це у свою трубу і паліть =)

nJoy!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.