Форум сайта python.su
Пишу консольную утилиту, которой надо передавать определенные аргументы. И нужно кроме обычных “-f” и “–file” использовать аргументы в виде строки, причем не просто строки, а такого вида: mysql://<user>@<host>/database. Парсер, конечно, лох, но он начинает ругаться, что в аргументах все длинные строки должны начинаться с “–”. Я понимаю его логику, но как это обойти? И да, как написать собственный обработчик для аргумента вида, представленного выше, и встроить его в optparse? Объясните, пожалуйста, как покрасивей выйти из ситуации, очень нужно.
Офлайн
у парсера кроме опций, которые передаются через - и – есть еще и аргументы - которые никак не нужно указывать.
Вы получаете их в 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/
Он хороший и будет включен в стандартную поставку.
Позиционные аргументы, конечно, поддерживаются без проблем - смотрите первый пример в документации.
Офлайн
Пока в сторону argparse не смотрел, но вот опять проблема. Не получается никак создать аргумент вида “–arg”, чтобы он мог быть как со значением (“–arg=15”), так и без него, просто “–arg”. Как это сделать?
Офлайн
проставьте для вашего аргумента default value
Офлайн
EnchantnerЯ боюсь тут даже default не поможет. Вы хотите сделать вашу опцию одновременно и boolean и integer? Это не получиться. Значение по умолчанию будет использовано, если опция не будет вызвана в командной строке. Если же поставить тип int и вызвать без параметра, то вы получите ошибку - типа такой(у меня string - но это особой роли не играет):
Пока в сторону argparse не смотрел, но вот опять проблема. Не получается никак создать аргумент вида “–arg”, чтобы он мог быть как со значением (“–arg=15”), так и без него, просто “–arg”. Как это сделать?
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" )
...
Отредактировано (Янв. 7, 2010 08:56:08)
Офлайн
Андрей СветловСпасибо за совет. Я конечно посмотрю но использовать его буду, только когда он войдет не то что в стандартную поставку питона, а в версию питона, которая входит в Debian Stable.
Добрый совет: забудьте про optparse и использует argparse. http://code.google.com/p/argparse/
Он хороший и будет включен в стандартную поставку.
Позиционные аргументы, конечно, поддерживаются без проблем - смотрите первый пример в документации.
Офлайн
Вас уже не удовлетворяют библиотеки, которые устанавливаются через 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')
Офлайн
Андрей СветловЯ бы предпочел через aptitude|apt-get и желательно с dvd дисков со Stable - не везде на тех сервера с которыми я работаю есть интернет. Можно конечно и на флэшке таскать - но неудобно.
Вас уже не удовлетворяют библиотеки, которые устанавливаются через easy_install/pip?
Отредактировано (Янв. 7, 2010 09:47:28)
Офлайн