Найти - Пользователи
Полная версия: optparse и аргументы
Начало » Python для новичков » optparse и аргументы
1 2
Enchantner
Пишу консольную утилиту, которой надо передавать определенные аргументы. И нужно кроме обычных “-f” и “–file” использовать аргументы в виде строки, причем не просто строки, а такого вида: mysql://<user>@<host>/database. Парсер, конечно, лох, но он начинает ругаться, что в аргументах все длинные строки должны начинаться с “–”. Я понимаю его логику, но как это обойти? И да, как написать собственный обработчик для аргумента вида, представленного выше, и встроить его в optparse? Объясните, пожалуйста, как покрасивей выйти из ситуации, очень нужно.
Alex2ndr
у парсера кроме опций, которые передаются через - и – есть еще и аргументы - которые никак не нужно указывать.
Вы получаете их в parse_args(). Вот вам пример - здесь start, stop и status как раз те самые аргументы. Попробуйте передать вашу строку таким аргументом.
def parseOptions():
parser = OptionParser(usage="Usage: %prog start|stop|status", version="%prog 0.2")
# Парсим параметры ком строки, заодно проверяя их тип
parser.add_option('--fwonly', '-f', action="store_true", dest='fwstart', \
default=False, help="action only for firewall" )
parser.add_option('--sponly', '-s', action="store_true", dest='spstart', \
default=False, help="action only for shaper" )
parser.add_option('--onlylist', '-l', action="store_true", dest='lstonly', \
default=False, help="only show rules")
(options, args) = parser.parse_args()
# Проверяем полученные параметры
if len(args):
if not args[0] in ['start','stop','status']:
parser.error("options not in start|stop|status")
else:
parser.error("any options in start|stop|status not present")
return options,args[0]
Андрей Светлов
Добрый совет: забудьте про optparse и использует argparse. http://code.google.com/p/argparse/
Он хороший и будет включен в стандартную поставку.
Позиционные аргументы, конечно, поддерживаются без проблем - смотрите первый пример в документации.
Enchantner
Пока в сторону argparse не смотрел, но вот опять проблема. Не получается никак создать аргумент вида “–arg”, чтобы он мог быть как со значением (“–arg=15”), так и без него, просто “–arg”. Как это сделать?
Андрей Светлов
проставьте для вашего аргумента default value
Alex2ndr
Enchantner
Пока в сторону argparse не смотрел, но вот опять проблема. Не получается никак создать аргумент вида “–arg”, чтобы он мог быть как со значением (“–arg=15”), так и без него, просто “–arg”. Как это сделать?
Я боюсь тут даже default не поможет. Вы хотите сделать вашу опцию одновременно и boolean и integer? Это не получиться. Значение по умолчанию будет использовано, если опция не будет вызвана в командной строке. Если же поставить тип int и вызвать без параметра, то вы получите ошибку - типа такой(у меня string - но это особой роли не играет):
master alex@deb-home:~/Development$ python ./python/main.py start -c
Usage: main.py start|stop|status

main.py: error: -c option requires an argument

master alex@deb-home:~/Development$ cat ./python/main.py
...
parser.add_option('--config', '-c', dest='config', type="string", \
metavar='CFGFILE', default="./settings/settings.cfg", \
help="path to configuration file. Default is %default" )
...
Без параметра можно вызывать только boolean.
Alex2ndr
Андрей Светлов
Добрый совет: забудьте про optparse и использует argparse. http://code.google.com/p/argparse/
Он хороший и будет включен в стандартную поставку.
Позиционные аргументы, конечно, поддерживаются без проблем - смотрите первый пример в документации.
Спасибо за совет. Я конечно посмотрю но использовать его буду, только когда он войдет не то что в стандартную поставку питона, а в версию питона, которая входит в Debian Stable.
Андрей Светлов
Вас уже не удовлетворяют библиотеки, которые устанавливаются через easy_install/pip?
Андрей Светлов
Накидал на коленке:
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-a', '--arg', const='const', default='default', nargs='?')

print parser.parse_args()
D:\Temp>test_argparse.py -a
Namespace(arg='const')

D:\Temp>test_argparse.py -a 123
Namespace(arg='123')

D:\Temp>test_argparse.py
Namespace(arg='default')
Alex2ndr
Андрей Светлов
Вас уже не удовлетворяют библиотеки, которые устанавливаются через easy_install/pip?
Я бы предпочел через aptitude|apt-get и желательно с dvd дисков со Stable - не везде на тех сервера с которыми я работаю есть интернет. Можно конечно и на флэшке таскать - но неудобно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB