2015-05-03 2 views
0

Я использую эту Библиотеку для разбора аргументов в Python: https://docs.python.org/2/library/argparse.htmlУправление нескольких следующих позиционный аргумент с argparse

До сих пор у меня есть это:

prog arg1 [-s arg2 [arg2 ...]] [-m arg3 [arg3 ...]] 

И я хочу это:

prog arg1 -s arg2 [arg2 ...] -m arg3 [arg3 ...] 

Это мой код для питона:

parser = argparse.ArgumentParser() 
parser.add_argument('path', type=str, 
        help="path used for the generation of the rouge files") 
parser.add_argument('-s', '--systems', type=str, nargs='+', 
        help="path to the systems generated summary files") 
parser.add_argument('-m', '--models', type=str, nargs='+', 
        help="path to the reference summary files") 
args = parser.parse_args() 
print args 

Проблема заключается в том, что вы вызываете программу без дополнительных аргументов, она не дает ошибку (слишком мало аргументов). Я хочу, чтобы мои необязательные аргументы, чтобы быть обязательно, но когда вы сделаете следующий вызов, анализатор не выяснить, какой вид арг участвуют ...

Для Exemple со следующим кодом:

parser = argparse.ArgumentParser() 
parser.add_argument('arg1', type=str, nargs='+') 
parser.add_argument('arg2', type=str, nargs='+') 
parser.add_argument('arg3', type=str, nargs='+') 
args = parser.parse_args() 

А следующий вызов:

python test.py arg1 arg1 arg1 arg2 arg2 arg3 arg3 

Я получил это:

Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3']) 

Наверняка ее е формат этой прогой:

prog arg1 [arg1 ...] arg2 [arg2 ...] arg3 

Спасибо за помощь :)

+0

Что ваш вопрос? Работает ли этот код? –

+0

Этот код работает, но аргументы необязательны. Я не понимаю, как заставить их быть обязательно. – Cadene

+0

Что вы подразумеваете под «обязательным». Аргументы 'nargs = '+'' уже требуются. –

ответ

2

optionals может принимать параметр required=True. Это может быть все, что вам нужно.

p=argparse.ArgumentParser() 
p.add_argument('-m',nargs='+',required=True) 
p.add_argument('-n',nargs='+',required=True) 
p.print_usage() 

производства

usage: ipython3 [-h] -m M [M ...] -n N [N ...] 

Как почему:

Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3']) 

вы указали, что каждый из arg1, arg2, arg3 требуется 1 или более строк. Таким образом, он разделил длинный список, указав arg2 и arg3 каждый (что соответствует их требованию), а остальные остальное - arg1. Если вы знакомы с regex, это эквивалентно

In [96]: re.match('(A+)(A+)(A+)','AAAAAAAAA').groups() 
Out[96]: ('AAAAAAA', 'A', 'A') 

(СА не может читать ваши мысли и выделить все «ARG2, чтобы args2 только потому, что имена выглядят одинаково :).)

Таким образом, если вам нужно разделить списки аргументов определенным образом, тогда optionals (флаги) - это путь.А между nargs и required у вас есть довольно немного контроля над числами.

+0

Спасибо, что это работает сейчас;) – Cadene

1

То, что вы хотите, не представляется возможным. Подумайте об этом: если бы вы выполнили собственный анализ аргументов без argparse, как бы вы определили, является ли позиционный аргумент последним из аргументов arg1 или первым из аргументов arg2?

Я думаю, что решение, которое вы знаете (необязательные аргументы), прекрасно работает и даже предпочтительнее.

0

Я добавил требуется = True, и она работает, благодаря hpaulj

parser = argparse.ArgumentParser() 
parser.add_argument('path', type=str, 
        help="path used for the generation of the rouge files") 
parser.add_argument('-s', '--systems', type=str, nargs='+', required=True, 
        help="path to the systems generated summary files") 
parser.add_argument('-m', '--models', type=str, nargs='+', required=True, 
        help="path to the reference summary files") 
args = parser.parse_args() 

python summary2rouge.py 
usage: summary2rouge.py [-h] -s SYSTEMS [SYSTEMS ...] -m MODELS [MODELS ...] 
        path 
summary2rouge.py: error: too few arguments 

 Смежные вопросы

  • Нет связанных вопросов^_^