Найти - Пользователи
Полная версия: optparse проблемы с выводом подсказки.
Начало » Python для новичков » optparse проблемы с выводом подсказки.
1
UsCr
Здравствуйте. Решил поиграться с optparse. Написал вот такой кусок:
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-p", "--path", action="store", type="string", dest="path", default=os.path.abspath(os.curdir),\
help="Задайте директорию, в которой будет работать скрипт. По умолчанию текущая.")
parser.add_option("-s", "--show-only", action="store_true", dest="show", default=False,\
help="Используйте для простого определения и вывода кодировки файла, без изменения.")
parser.add_option("-d", "--decode" ,action="store", type="string", dest="code", default='utf8',\
help="Задайте кодировку, на которую хотите заменить исходную. По умолчанию 'utf8'")
parser.add_option("--remove", action="store_true", dest="remove", default=False,\
help="Используйте для удаления исходных файлов. Игнорируется при наличии '-s'")
parser.add_option("-e", "--extension", action="store", type="string", dest="extension", default="",\
help="Расширение фалов, с которыми будет работать скрипт. По умолчанию все файлы.")
parser.add_option("--prefix", action="store", type="string", dest="prefix", default="re_",\
help="Префикс, который нужно добавить к вновь созданному файлу. По умолчанию 're_'")
(options, args) = parser.parse_args()
В скрипте я имею доступ к переданныи опциям, с этим всё нормально. При вызове скрипта с опцией -h получаю вот что:
Traceback (most recent call last):
File "code_juggler-a0.1.py", line 70, in <module>
(options, args) = parser.parse_args()
File "/usr/lib/python2.6/optparse.py", line 1394, in parse_args
stop = self._process_args(largs, rargs, values)
File "/usr/lib/python2.6/optparse.py", line 1438, in _process_args
self._process_short_opts(rargs, values)
File "/usr/lib/python2.6/optparse.py", line 1545, in _process_short_opts
option.process(opt, value, values, self)
File "/usr/lib/python2.6/optparse.py", line 788, in process
self.action, self.dest, opt, value, values, parser)
File "/usr/lib/python2.6/optparse.py", line 810, in take_action
parser.print_help()
File "/usr/lib/python2.6/optparse.py", line 1664, in print_help
file.write(self.format_help().encode(encoding, "replace"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 128: ordinal not in range(128)
В начале файла указано: # -*- coding: utf-8 -*-
При написании хелпов на английском ситуация не меняется.
Андрей Светлов
А что стоит в LANG и sys.stdout.encoding, locale.getpreferredencoding()
UsCr
sys.stdout.encoding - ‘utf-8’

Остальное NameError: name <name> is not defined

Или вас интересует системный LANG? Тогда ru_RU.utf8.
pyuser
сдается мне, что нужно было help-строку сделать юникодом (u“…”) :)
UsCr
pyuser
сдается мне, что нужно было help-строку сделать юникодом (u“…”) :)
Нет. Аналогичная ругань…
Андрей Светлов
Да ну? При ваших настройках должно помогать
UsCr
Андрей Светлов
Да ну? При ваших настройках должно помогать
Ну… Мамой клянусь…

Вот так написал:
parser.add_option("--remove", action="store_true", dest="remove", default=False,\
help=u"Используйте для удаления исходных файлов. Игнорируется при наличии '-s'")
parser.add_option("-e", "--extension", action="store", type="string", dest="extension", default="",\
help=u"Расширение фалов, с которыми будет работать скрипт. По умолчанию все файлы.")
Запускаю script -h. Получаю:
Traceback (most recent call last):
File "code_juggler-a0.1.py", line 80, in <module>
(options, args) = parser.parse_args()
File "/usr/lib/python2.6/optparse.py", line 1394, in parse_args
stop = self._process_args(largs, rargs, values)
File "/usr/lib/python2.6/optparse.py", line 1438, in _process_args
self._process_short_opts(rargs, values)
File "/usr/lib/python2.6/optparse.py", line 1545, in _process_short_opts
option.process(opt, value, values, self)
File "/usr/lib/python2.6/optparse.py", line 788, in process
self.action, self.dest, opt, value, values, parser)
File "/usr/lib/python2.6/optparse.py", line 810, in take_action
parser.print_help()
File "/usr/lib/python2.6/optparse.py", line 1664, in print_help
file.write(self.format_help().encode(encoding, "replace"))
File "/usr/lib/python2.6/optparse.py", line 1644, in format_help
result.append(self.format_option_help(formatter))
File "/usr/lib/python2.6/optparse.py", line 1624, in format_option_help
result.append(OptionContainer.format_option_help(self, formatter))
File "/usr/lib/python2.6/optparse.py", line 1073, in format_option_help
result.append(formatter.format_option(option))
File "/usr/lib/python2.6/optparse.py", line 315, in format_option
help_text = self.expand_default(option)
File "/usr/lib/python2.6/optparse.py", line 287, in expand_default
return option.help.replace(self.default_tag, str(default_value))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 15: ordinal not in range(128)
bazooka
если поставить u у всех строк то работает
# coding: utf8
from optparse import OptionParser
import os

if __name__ == '__main__':
parser = OptionParser()
parser.add_option(u"-p", u"--path", action=u"store", type=u"string", dest=u"path", default=os.path.abspath(os.curdir),\
help=u"Задайте директорию, в которой будет работать скрипт. По умолчанию текущая.")
parser.add_option(u"-s", u"--show-only", action=u"store_true", dest=u"show", default=False,\
help=u"Используйте для простого определения и вывода кодировки файла, без изменения.")
parser.add_option(u"-d", u"--decode" ,action=u"store", type=u"string", dest=u"code", default='utf8',\
help=u"Задайте кодировку, на которую хотите заменить исходную. По умолчанию 'utf8'")
parser.add_option(u"--remove", action=u"store_true", dest=u"remove", default=False,\
help=u"Используйте для удаления исходных файлов. Игнорируется при наличии '-s'")
parser.add_option(u"-e", u"--extension", action=u"store", type=u"string", dest=u"extension", default=u"",\
help=u"Расширение фалов, с которыми будет работать скрипт. По умолчанию все файлы.")
parser.add_option(u"--prefix", action=u"store", type=u"string", dest=u"prefix", default=u"re_",\
help=u"Префикс, который нужно добавить к вновь созданному файлу. По умолчанию 're_'")
(options, args) = parser.parse_args()
UsCr
bazooka
если поставить u у всех строк то работает
Нет.
    parser.add_option(u"-p", u"--path", action=u"store", type=u"string", dest=u"path", default=os.path.abspath(os.curdir),\
help=u"Задайте директорию, в которой будет работать скрипт. По умолчанию текущая.")
parser.add_option(u"-s", u"--show-only", action=u"store_true", dest=u"show", default=False,\
help=u"Используйте для простого определения и вывода кодировки файла, без изменения.")
parser.add_option(u"-d", u"--decode" ,action=u"store", type=u"string", dest=u"code", default=u"utf8",\
help=u"Задайте кодировку, на которую хотите заменить исходную. По умолчанию 'utf8'")
parser.add_option(u"--remove", action=u"store_true", dest=u"remove", default=False,\
help=u"Используйте для удаления исходных файлов. Игнорируется при наличии '-s'")
parser.add_option(u"-e", u"--extension", action=u"store", type=u"string", dest=u"extension", default=u"",\
help=u"Расширение файлов, с которыми будет работать скрипт. По умолчанию все файлы.")
parser.add_option(u"--prefix", action=u"store", type=u"string", dest=u"prefix", default=u"re_",\
help=u"Префикс, который нужно добавить к вновь созданному файлу. По умолчанию 're_'")
parser.add_option(u"-i", u"--ignore-subpath", action=u"store_true", dest=u"ignore", default=False, \
help=u"Используйте для игнорирования вложенных каталогов.")
parser.add_option(u"-a", u"--accuracy", type=u"int", dest=u"accuracy", default=10000, \
help=u"Задайте точность определения кодировки. По умолчанию 10000.")
Старая ошибка.

В отдельном файле тоже не работает. Хотя это и не удивительно.
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