Знак минус UTF-8 отклонен в аргументах командной строки python - PullRequest
1 голос
/ 05 декабря 2011

Я запускаю python 2.6 в Ubuntu Lucent и испытываю проблемы с получением правильной интерпретации знака минус в отрицательных аргументах командной строки, особенно когда вызов сценария инициируется через ОС через Rails (с использованием обратных кавычек).В частности, знак минус появляется как 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'

Любая помощьбыл бы оценен!

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Ваши входные данные содержат символ 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
1 голос
/ 05 декабря 2011

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

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

...