Python命令行参数拒绝UTF-8负号

1 投票
2 回答
581 浏览
提问于 2025-04-17 07:41

我在Ubuntu Lucent上运行Python 2.6,遇到了一些麻烦,特别是在通过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

你的输入数据里有一个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

你可能需要用一些小技巧,让argparse知道你要的是一个字符串。

就Python、你的系统和RoR(Ruby on Rails)来说,-之间没有任何关系。如果你想真正解决这个问题(而不是用小技巧绕过),你得去看看Rails的代码,看看它是从哪里获取数据的。在某个环节,华丽的输出是很重要的。

撰写回答