Знак минус UTF-8 отклонен в аргументах командной строки python

1

Я запускаю python 2.6 на Ubuntu Lucent и затрудняюсь корректно интерпретировать знак минус в отрицательных аргументах командной строки, особенно когда вызов сценария инициируется через ОС через Rails (с использованием backquotes). В частности, знак минус, похоже, входит в UTF-8.

Когда аргументы командной строки интерпретируются вручную, как в:

lng = float(sys.argv[4])

он вызывает ошибку:

ValueError: invalid literal for float(): ‐122.768

Как взломать, я могу обойти это, сопоставляя первые три байта как "\ xe2", "\ x80" и "\ x90" и заменяя их своим отрицательным знаком.

Когда аргументы командной строки интерпретируются через argparse (вер. 1.2.1), как в:

parser.add_argument('--coords', metavar='Coord', dest='coordinates', type=float, nargs=3, help='Latitude, Longitude, and Altitude')

он вызывает ошибку:

sC.py: error: argument --coords: invalid float value: '\xe2\x80\x90122.76838'

Любая помощь будет оценена!

  • 1
    Как вы на самом деле получаете этот знак минус в свой код Ruby? Используйте редактор, который работает правильно, может быть?
Теги:
argparse
command-line

2 ответа

1
Лучший ответ

Возможно, вам придется использовать свой взлом и сказать argparse, чтобы ожидать строку.

Что касается Python, ваша система и RoR - и никак не связаны. Если вы хотите решить эту проблему (вместо того, чтобы взломать ее), вы переходите к коду рельсов и смотрите, откуда он получает свои данные. Где-то вдоль линии интересный выход был важен.

  • 0
    Я не знаком с «причудливым выходом» и не уверен, используем ли мы это, но рассмотрим его. На данный момент я говорю argparse ожидать строку.
  • 0
    Определенное программное обеспечение - обычно обработка текста или ведение блога - превратит две черты в одну длинную черту. Это выглядит хорошо для конечного пользователя, но программы обычно не знают, как с этим справиться.
3

Ваши входные данные содержат символ Unicode, который не является стандартным ascii-дефисом.

import unicodedata as ud
data = '\xe2\x80\x90122.76838'
unicode_data = data.decode('utf8')
print repr(ud.name(unicode_data[0]))
print repr(ud.name(u'-')) # An ascii hyphen

Вывод:

'HYPHEN'
'HYPHEN-MINUS'

Хотя они могут выглядеть одинаково при печати, это не так. Ограничьте или дезинформируйте ввод.

print float(unicode_data.replace(u'\N{HYPHEN}',u'-'))

Вывод:

-122.76838
  • 0
    Спасибо, это более чистый способ замены, чем у меня. Тем не менее, я бы предпочел, если бы это не было необходимости.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню