2013-08-16 3 views
0

Я пытаюсь использовать argparse, но у меня проблема с тем, что по какой-то причине мои позиционные параметры должны быть первыми в командной строке. Я хочу, чтобы positional был последним, так как это список имен файлов.Argrelse positional parameter sequest

self.parser = ArgumentParser(description=program_license, 
        formatter_class=RawDescriptionHelpFormatter, 
        conflict_handler='resolve') 
    self.parser.add_argument('-V', '--version', 
        action='version', 
        version=program_version_message) 
    self.parser.add_argument('--logfile', action='store', 
        dest='logfile', default='daddyvision.log') 
    self.parser.add_argument('prog', help=SUPPRESS, nargs=1) 
    self.parser.add_argument('library', metavar="library", nargs='*') 

    group_loglvl = self.parser.add_mutually_exclusive_group() 
    group_loglvl.add_argument("--verbose", dest="loglevel", 
        action="store_const", const="VERBOSE", 
        default='INFO') 
    group_loglvl.add_argument("--debug", dest="loglevel", 
        action="store_const", const="DEBUG") 
    group_loglvl.add_argument("--trace", dest="loglevel", 
        action="store_const", const="TRACE") 
    group_loglvl.add_argument("--quiet", dest="loglevel", 
        action="store_const", const="WARNING") 
    group_loglvl.add_argument("--errors", dest="loglevel", 
        action="store_const", const="ERROR") 

    args = self.parser.parse_args(arg) 

если моя командная строка: имя файла --error PGM я получаю «ошибка: Непризнанные аргументы: имя файла»

если моя CMD линия файла --error PGM он работает без ошибок.

Что я делаю неправильно. Все, что я читал, приводит меня к мысли, что позиционирование может наступить первыми или последними. Python 2.7.

Если я делаю позиционное требование (nargs = '+'), оно работает, но парм не является обязательным.

+0

Это может показаться вам полезным: https://github.com/docopt/docopt – Blender

ответ

0

Проще проверить ваш код, если вы его очистите, удалив такие вещи, как self. Мне нравится делать import argparse, а затем иметь возможность вставить остальные и получить пример выполнения.

Как вы это тестируете?

parser.parse_args('pgm --error filename'.split()) 

или

parser.parse_args('--error filename'.split()) 

parser.parse_args() разбирает sys.argv[1:]. Если бы я запускал сценарий с именем pgm с этим аргументом, я бы ожидал разбора --error filename.

Помощь, без SUPPRESS является:

usage: ipython [-h] [-V] [--logfile LOGFILE] 
       [--verbose | --debug | --trace | --quiet | --errors] 
       prog [library [library ...]] 

positional arguments: 
    prog 
    library 

optional arguments: 
    -h, --help   show this help message and exit 
    ... 
    --errors 

Несмотря на это, ключ к вашей ошибке является prog [library [library ...]] части usage.

То, что происходит с pgm --error filename, состоит в том, что строка pgm устанавливает как prog='pgm', так и library=[]. С * (или ?), library не удовлетворяет ничьей вообще. Сделав это, ему некуда положить строку filename.

pgm filename --error дает library=['filename']. --error pgm filename также должен работать.

Проблема заключается не в том, что постсоветы должны быть первыми (или последними), но должны быть вместе (если второй является «?» Или «*»).

Эта ошибка Сообщение пытается объяснить это взаимодействие «*» positionals и дополнительными опциями

http://bugs.python.org/issue14191#msg185517


Если pgm это название программы sys.argv[0], то вам не нужно в argparse. Удалите аргумент prog, и ваша проблема исчезнет (тогда есть только одно позиционирование).

+0

Когда я передаю sys.argv(), без записи pgm, я получаю sys.argv [0] в качестве первой записи в список для библиотеки. – user1110844

+0

'sys.argv() 'дает ошибку. Если вы хотите передать 'sys.argv' в' parse_args', используйте 'sys.argv [1:]' - i.e все, кроме 'sys.argv [0]'. – hpaulj

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