Shlex.split все еще не поддерживает юникод?
Согласно документации, в 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. Я получаю точно такую же ошибку на машине Ubuntu с "родным" python 2.7.3.
Ответы
Ответ 1
Код shlex.split()
обертывает как экземпляры unicode()
, так и str()
в объекте StringIO()
, который может обрабатывать только латинские-1 байты (а не полный диапазон кодовых страниц в Юникоде).
Вам нужно будет закодировать (чтобы UTF-8 работал), если вы все еще хотите использовать shlex.split()
; поддерживающие модуль означали, что объекты unicode()
поддерживаются сейчас, а не ничего вне диапазона кодовых точек Latin-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 теперь закрытая проблема Python попыталась решить эту проблему, но модуль очень ориентирован на байт-поток, а новый патч не материализовался. В настоящее время использование iso-8859-1
или UTF-8
кодирования - лучшее, что я могу придумать для вас.
Ответ 2
На самом деле был патч более пяти лет. В прошлом году я устал копировать ushlex в каждом проекте и помещать его в PyPI:
https://pypi.python.org/pypi/ushlex/
Ответ 3
Я использую 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']