Как выдать ошибку, если опции не заданы с optparse - PullRequest
1 голос
/ 16 апреля 2010

Я пытаюсь понять, как использовать optparse, но у меня возникла проблема.

Мой скрипт (представленный в этом упрощенном примере) берет файл и выполняет с ним разные операции в зависимости от параметров, которые в нем анализируются. Если параметры не анализируются, ничего не делается.

Для меня имеет смысл, что из-за этого должна быть выдана ошибка, если пользователь не указал никаких опций. Я не могу понять, как это сделать.

Я читал, что параметры должны быть необязательными и не обязательными. Означает ли это, что я неправильно использую опции? Если так, как я должен делать это вместо этого? Я не вижу другого способа сделать это.

#!/usr/bin/python

from optparse import OptionParser

dict = {'name': foo, 'age': bar}

parser = OptionParser()

parser.add_option("-n", "--name", dest="name")
parser.add_option("-a", "--age", dest="age")

(options, args) = parser.parse_args()

if options.name:
    dict['name'] = options.name

if options.age:
    dict['age'] = options.age

print dict

#END

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

Не знаю, обязательно ли я назвал бы это «неправильно», но да, вы используете опции не по назначению. (Я тоже это сделал для быстрых сценариев). Подумайте о том, чтобы сделать первый неопциональный аргумент командным словом, определяющим, что должен делать ваш скрипт; если вы хотите разрешить выполнение нескольких действий сценарием, вы можете принять несколько аргументов без опций. Вот как это делает git (или Subversion, или любая из многих других систем контроля версий), например:

git status

для проверки состояния файлов или

git stash

чтобы сохранить копию вашей работы или

git commit

для внесения изменений в хранилище. Первый неопциональный аргумент определяет действие, которое нужно предпринять. Если вы сделаете это таким образом, будет легко увидеть, не была ли предоставлена ​​команда, проверив длину args, возвращенную из parser.parse_args().

2 голосов
/ 16 апреля 2010

Аргумент обязательный для программы обычно задается без флага, т.е.пользователь понимает, что <filename> является обязательным, а не необязательным.parse_args возвращает объект параметров и список оставшихся аргументов - без флагов.Если этот список достаточно короток для вас (т. Е. Нет имени файла, в то время как вы ожидали его), не стесняйтесь выдавать ошибку, и вы можете использовать для этого возможность optparse, чтобы показать использование.

1 голос
/ 16 апреля 2010

метод parse_args сожрет все параметры в командной строке (это текст, следующий сразу за именем скрипта, начинающийся с - или - (и содержащий значение, если определенная опция определена как имеющая значение). остается после того, как все возможные параметры были проанализированы, называется "позиционные аргументы". Они могут быть доступны как обычный список sys.argv [1:]. Таким образом, аргументы, которые не являются "необязательными" (как говорится в вашем требовании), должны действительно быть позиционными аргументами, а не частью «опций», т. е. они не должны иметь вид

myscript.py --someopt=mandatory

но

myscript.py --someopt --someotheropt <madatory arg1> <mandatory arg2>

Зная это, вы можете легко написать правильную логику для sys.argv сразу после вызова pars_args (например, выдать ошибку, если у оставшегося argv нет двух обязательных аргументов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...