<p>您可以定义一个名为<code>_print</code>的本地函数(甚至可以通过将其命名为<code>print</code>来重写系统<code>print</code>函数),如下所示:</p>
<pre><code>import sys
def _print(data):
"""
If data is bytes, write to stdout using sys.stdout.buffer.write,
otherwise, assume it's str and convert to bytes with utf-8
encoding before writing.
"""
if type(data) != bytes:
data = bytes(data, 'utf-8')
sys.stdout.buffer.write(data)
_print('A')
_print(b'B')
</code></pre>
<p>输出应该是<code>AB</code>。你知道吗</p>
<p>注:通常系统<code>print</code>函数会向输出中添加一个换行符。上面的<code>_print</code>只输出数据(要么<code>bytes</code>,要么假设它是<code>str</code>),而不使用换行符。你知道吗</p>
<h3>缓冲实现</h3>
<p>如果需要缓冲I/O,可以使用<code>io</code>库中的工具来管理它。你知道吗</p>
<p>简单示例:</p>
<pre><code>import io
import sys
output_buffer = None
text_wrapper = None
def init_buffer():
global output_buffer, text_wrapper
if not output_buffer:
output_buffer = io.BytesIO()
text_wrapper = io.TextIOWrapper(
output_buffer,
encoding='utf-8',
write_through=True)
def write(data):
if type(data) == bytes:
output_buffer.write(data)
else:
text_wrapper.write(data)
def flush():
sys.stdout.buffer.write(output_buffer.getvalue())
# initialize buffer, write some data, and then flush to stdout
init_buffer()
write("A")
write(b"B")
write("foo")
write(b"bar")
flush()
</code></pre>
<p>例如,如果在函数中执行所有输出写入,则可以使用<code>contextlib.contextmanager</code>创建工厂函数,允许您使用<code>with ...</code>语句:</p>
<pre><code># This uses the vars and functions in the example above.
import contextlib
@contextlib.contextmanager
def buffered_stdout():
"""
Create a factory function for using the `with` statement
to write to the output buffer.
"""
global output_buffer
init_buffer()
fh = sys.stdout.buffer
try:
yield fh
finally:
try:
fh.write(output_buffer.getvalue())
except AttributeError:
pass
# open the buffered output stream and write some data to it
with buffered_stdout():
write("A")
write(b"B")
write("foo")
write(b"bar")
</code></pre>
<p>请参见:</p>
<ul>
<li><a href="https://pymotw.com/3/io/" rel="nofollow noreferrer">PyMOTW-3 - io — Text, Binary, and Raw Stream I/O Tools</a></li>
<li><a href="https://docs.python.org/3/library/io.html" rel="nofollow noreferrer">Python 3 - io — Core tools for working with streams</a></li>
<li><a href="https://docs.python.org/3/library/contextlib.html" rel="nofollow noreferrer">Python 3 - contextlib — Utilities for with-statement contexts</a></li>
<li><a href="https://stackoverflow.com/a/42800629/220783">This answer on stackoverflow: Difference between ^{<cd12>} and ^{<cd13>} in binary streams</a></li>
</ul>