Python optparse не работает для меня

В настоящее время я учусь тому, как использовать модуль Python optparse. Я пытаюсь следующий пример сценария, но переменная args выходит пустым. Я попробовал это, используя Python 2.5 и 2.6, но безрезультатно.

import optparse

def main():
  p = optparse.OptionParser()
  p.add_option('--person', '-p', action='store', dest='person', default='Me')
  options, args = p.parse_args()

  print '\n[Debug]: Print options:', options
  print '\n[Debug]: Print args:', args
  print

  if len(args) != 1:
    p.print_help()
  else:
    print 'Hello %s' % options.person

if __name__ == '__main__':
  main() 

Выход:

>C:\Scripts\example>hello.py -p Kelvin

[Debug]: Print options: {'person': 'Kelvin'}

[Debug]: Print args: []

Usage: hello.py [options]

Опции: -h, --help показать это справочное сообщение и выйти из -p PERSON, --person=PERSON

4 ответа

Решение

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

Если вы пытались запустить hello.py -p Kelvin file1.txt, вы найдете это person до сих пор было присвоено значение "Kelvin", а затем ваш args будет содержать "file1.txt",

Смотрите также документацию поoptparse:

parse_args() возвращает два значения:

  • optionsобъект, содержащий значения для всех ваших опций, например, если --file принимает один строковый аргумент, затем options.file будет именем файла, предоставленным пользователем, или None если пользователь не предоставил эту опцию
  • args, список позиционных аргументов, оставшихся после парсинга опций

В соответствии с optparse Помогите:

"При успешном завершении возвращает пару (values, args), где 'values' - это экземпляр Values ​​(со всеми значениями вашего параметра), а" args "- это список аргументов, оставшихся после анализа параметров."

Пытаться hello.py -p Kelving abcd - 'Kelvin' будет проанализирован с помощью optparse, 'abcd' попадет в args переменная, возвращаемая parse_args

import ast

(options, args) = parser.parse_args()
noargs = ast.literal_eval(options.__str__()).keys()
if len(noargs) != 1:
    parser.error("ERROR: INCORRECT NUMBER OF ARGUMENTS")
    sys.exit(1)

Примечание: "параметры" - это словарь с добавленными вами параметрами. "Args" - это список с неразобранными аргументами. Вы не должны смотреть на длинные "арги". Вот расшифровка для иллюстрации:

moshez-mb:profile administrator$ cat foo
import optparse

def main():
    p = optparse.OptionParser()
    p.add_option('--person', '-p', action='store', dest='person', default='Me')
    options, args = p.parse_args()
    print '\n[Debug]: Print options:', options
    print '\n[Debug]: Print args:', args
    print
    if len(args) != 1:
        p.print_help()
    else:
        print 'Hello %s' % options.person

if __name__ == '__main__':
    main()
moshez-mb:profile administrator$ python foo

[Debug]: Print options: {'person': 'Me'}

[Debug]: Print args: []

Usage: foo [options]

Options:
  -h, --help            show this help message and exit
  -p PERSON, --person=PERSON
moshez-mb:profile administrator$ python foo -p Moshe

[Debug]: Print options: {'person': 'Moshe'}

[Debug]: Print args: []

Usage: foo [options]

Options:
  -h, --help            show this help message and exit
  -p PERSON, --person=PERSON
moshez-mb:profile administrator$ python foo -p Moshe argument

[Debug]: Print options: {'person': 'Moshe'}

[Debug]: Print args: ['argument']

Hello Moshe
moshez-mb:profile administrator$ 
Другие вопросы по тегам