小编Mar*_*ann的帖子

将sys.stdout缓冲区设置为零的Python标准习惯用法不适用于Unicode

当我在Python中编写sysadmin脚本时,sys.stdout上的缓冲区会影响对print()的每次调用,这很烦人,因为我不想等待刷新缓冲区然后获取大量的行一旦在屏幕上,我想在脚本生成新输出后立即获得单独的输出行.我甚至不想等待换行,所以看看输出.

在python中经常使用的成语是

import os
import sys
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.现在我注意到它不适用于Unicode.请参阅以下脚本:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import print_function, unicode_literals

import os
import sys

print('Original encoding: {}'.format(sys.stdout.encoding))
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
print('New encoding: {}'.format(sys.stdout.encoding))

text = b'Eisb\xe4r'
print(type(text))
print(text)

text = text.decode('latin-1')
print(type(text))
print(text)
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

Original encoding: UTF-8
New encoding: None
<type 'str'>
Eisb?r
<type 'unicode'>
Traceback (most recent call last):
  File "./export_debug.py", line 18, in <module>
    print(text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in …
Run Code Online (Sandbox Code Playgroud)

python unicode buffer stdout

6
推荐指数
1
解决办法
1951
查看次数

标签 统计

buffer ×1

python ×1

stdout ×1

unicode ×1