Python参数被读作代码

时间:2013-12-19 20:36:56

标签: python macos ascii getopt

尝试运行Python脚本时,例如:

python test.py --test 'Test'

似乎getopt失败了。并打印sys.argv透露:

['test.py', '\xe2\x80\x94-test', '\xe2\x80\x9cTest\xe2\x80\x9d']

我正在将命令复制并粘贴到OS X上的终端。该命令位于可能已保存在Windows上的文本文件中。这有什么可能的原因,因为我以前没有遇到过这个问题?

如果我在终端重新输入命令,它可以正常工作。有没有办法处理脚本中的参数,以便正确解释它们?

1 个答案:

答案 0 :(得分:4)

您的Windows编辑器使用em-dash替换了常规短划线,并使用'fancy'样式引用替换了引号:

>>> '\xe2\x80\x94-test'.decode('utf8')
u'\u2014-test'
>>> print '\xe2\x80\x94-test'.decode('utf8')
—-test
>>> '\xe2\x80\x9cTest\xe2\x80\x9d'.decode('utf8')
u'\u201cTest\u201d'
>>> print '\xe2\x80\x9cTest\xe2\x80\x9d'.decode('utf8')
“Test”
>>> import unicodedata
>>> for u in u'\u2014\u201c\u201d':
...     print u, unicodedata.name(u)
... 
— EM DASH
“ LEFT DOUBLE QUOTATION MARK
” RIGHT DOUBLE QUOTATION MARK

下次使用面向文本的编辑器;文字处理者有责任用“更漂亮”的版本替换文字。

您可以unicode.translate()来电:

>>> import sys
>>> sys.argv = ['test.py', '\xe2\x80\x94-test', '\xe2\x80\x9cTest\xe2\x80\x9d']
>>> map = {0x2014: u'-', 0x201c: u"'", 0x201d: u"'"}
>>> sys.argv[1:] = [s.decode('utf8').translate(map).encode('utf8') for s in sys.argv[1:]]
>>> sys.argv
['test.py', '--test', "'Test'"]

请注意,shell不会正确解析空格,因为它没有常规引号可供使用;您可能希望使用上述方法首先翻译文本文件,然后将正确引用的字符串粘贴到shell中。