2013-06-15 5 views
13

Когда я запустил parsePlotSens.py -s bw hehe, он говорит, что hehe является непризнанным аргументом. Однако, если я запустил parsePlotSens.py hehe -s bw, все в порядке. В идеале я бы хотел, чтобы он работал в обоих случаях.python argparse: непризнанные аргументы

Любые советы? Ниже мой код:

if __name__ == '__main__' : 

    parser = argparse.ArgumentParser(prog='parsePlotSens'); 
    parser.add_argument('-s', '--sort', nargs =1, action = 'store', choices = ['mcs', 'bw'], default='mcs', help=sorthelp) 
    parser.add_argument('filename', nargs ='+', action = 'store') 
    option = parser.parse_args(sys.argv) 

ответ

28

Не передавать sys.argv в качестве аргумента для parse_args. Просто используйте

option = parser.parse_args() 

Если пройти sys.argv в parse_args, то путь или имя самого сценария является первым пунктом в sys.argv и, таким образом, становится значением option.filename. Затем hehe становится неизвестным аргументом.

Если вы опустили sys.argv, тогда parse_args разобрал sys.argv, как ожидалось.

+6

В качестве альтернативы вы можете вызвать parser.parse_args (sys.argv [1:]). Внутренний argparse делает именно это. – MarioVilas

4

Кроме того, в качестве дополнения к ответу unutbu, его хранения аргументов в словаре таким образом делает тесты легко:

args = vars(parser.parse_args()) 
print args 

печатает словарь:

{'sort': ['bw'], 'filename': ['hehe']} 

Как:

if args['sort'] == 'bw': 
    # code here 

... 
0

Вы можете обойти эту проблему, позволяя неизвестные аргументы

Заменить

args = parser.parse_args() 

с

args, unknown = parser.parse_known_args() 
Смежные вопросы