尝试运行Python脚本时,例如:
python test.py --test 'Test'
似乎getopt失败了。并打印sys.argv透露:
['test.py', '\xe2\x80\x94-test', '\xe2\x80\x9cTest\xe2\x80\x9d']
我正在将命令复制并粘贴到OS X上的终端。该命令位于可能已保存在Windows上的文本文件中。这有什么可能的原因,因为我以前没有遇到过这个问题?
如果我在终端重新输入命令,它可以正常工作。有没有办法处理脚本中的参数,以便正确解释它们?
答案 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中。