gpt4 book ai didi

python - 如何修复将 Python 子进程迁移到 unicode_literals 的编码?

转载 作者:太空狗 更新时间:2023-10-30 00:35:52 25 4
gpt4 key购买 nike

我们正准备迁移到 Python 3.4 并添加了 unicode_literals。我们的代码广泛依赖于使用 subprocess 模块的外部实用程序的管道。以下代码片段在 Python 2.7 上运行良好,可以将 UTF-8 字符串通过管道传输到子进程:

kw = {}
kw[u'stdin'] = subprocess.PIPE
kw[u'stdout'] = subprocess.PIPE
kw[u'stderr'] = subprocess.PIPE
kw[u'executable'] = u'/path/to/binary/utility'
args = [u'', u'-l', u'nl']

line = u'¡Basta Ya!'

popen = subprocess.Popen(args,**kw)
popen.stdin.write('%s\n' % line.encode(u'utf-8'))
...blah blah...

以下更改引发此错误:

from __future__ import unicode_literals

kw = {}
kw[u'stdin'] = subprocess.PIPE
kw[u'stdout'] = subprocess.PIPE
kw[u'stderr'] = subprocess.PIPE
kw[u'executable'] = u'/path/to/binary/utility'
args = [u'', u'-l', u'nl']

line = u'¡Basta Ya!'

popen = subprocess.Popen(args,**kw)
popen.stdin.write('%s\n' % line.encode(u'utf-8'))
Traceback (most recent call last):
File "test.py", line 138, in <module>
exitcode = main()
File "test.py", line 57, in main
popen.stdin.write('%s\n' % line.encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

对于通过管道传递 UTF-8 有什么建议吗?

最佳答案

'%s\n' 当你使用 unicode_literals 时是一个 unicode 字符串:

>>> line = u'¡Basta Ya!'
>>> '%s\n' % line.encode(u'utf-8')
'\xc2\xa1Basta Ya!\n'
>>> u'%s\n' % line.encode(u'utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

发生的情况是您的编码值正在被解码插入到unicode '%s\n' 字符串中。 p>

你必须使用字节串来代替;在字符串前加上 b:

>>> from __future__ import unicode_literals
>>> line = u'¡Basta Ya!'
>>> b'%s\n' % line.encode(u'utf-8')
'\xc2\xa1Basta Ya!\n'

或在 插值之后编码:

>>> line = u'¡Basta Ya!'
>>> ('%s\n' % line).encode(u'utf-8')
'\xc2\xa1Basta Ya!\n'

在 Python 3 中,无论如何您都必须将字节串写入管道。

关于python - 如何修复将 Python 子进程迁移到 unicode_literals 的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27722720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com