根据文档,在Python 2.7.3中,shlex应该支持UNICODE。但是,在运行下面的代码时,我得到:UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-189: ordinal not in range(128)
我做错了吗?
import shlex
command_full = u'software.py -fileA="sequence.fasta" -fileB="新建文本文档.fasta.txt" -output_dir="..." -FORMtitle="tst"'
shlex.split(command_full)
确切错误如下:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shlex.py", line 275, in split
lex = shlex(s, posix=posix)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shlex.py", line 25, in __init__
instream = StringIO(instream)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 44-49: ordinal not in range(128)
这是我的mac使用python从macports输出的。我在使用“native”python 2.7.3的Ubuntu机器上得到完全相同的错误。
答案 0 :(得分:12)
shlex.split()
代码将unicode()
和str()
实例包装在StringIO()
对象中,该对象只能处理Latin-1字节(因此不是完整的unicode代码点范围)
如果您仍想使用shlex.split()
,则必须进行编码(UTF-8应该有效);模块的维护者意味着现在支持unicode()
个对象,而不是拉丁-1范围的代码点之外的任何对象。
编码,分割,解码给了我:
>>> map(lambda s: s.decode('UTF8'), shlex.split(command_full.encode('utf8')))
[u'software.py', u'-fileA=sequence.fasta', u'-fileB=\u65b0\u5efa\u6587\u672c\u6587\u6863.fasta.txt', u'-output_dir=...', u'-FORMtitle=tst']
A now closed Python issue试图解决这个问题,但该模块面向字节流,并没有实现新的补丁。目前使用iso-8859-1
或UTF-8
编码是我能为您提供的最佳选择。
答案 1 :(得分:3)
实际上五年多来一直是一个补丁。去年我厌倦了在每个项目中复制ushlex并把它放在PyPI上:
答案 2 :(得分:0)
我使用Python 2.7.16,找到了
shlex可以与通用字符串'xxxx'一起使用
ushlex可以与u'xxx'一起使用
# -*- coding:utf8 -*-
import ushlex
import shlex
command_full1 = 'software.py -fileA="sequence.fasta" -fileB="新建文本文档.fasta.txt" -output_dir="..." -FORMtitle="tst"'
print shlex.split(command_full1)
command_full2 = u'software.py -fileA="sequence.fasta" -fileB="新建文本文档.fasta.txt" - output_dir="..." -FORMtitle="tst"'
print ushlex.split(command_full2)
输出:
['software.py', '-fileA=sequence.fasta', '-fileB=\xe6\x96\xb0\xe5\xbb\xba\xe6\x96\x87\xe6\x9c\xac\xe6\x96\x87\xe6\xa1\xa3.fasta.txt', '-output_dir=...', '-FORMtitle=tst']
[u'software.py', u'-fileA=sequence.fasta', u'-fileB=\u65b0\u5efa\u6587\u672c\u6587\u6863.fasta.txt', u'-output_dir=...', u'-FORMtitle=tst']