gpt4 book ai didi

windows - 使用 Python 3 将 LF 打印到 Windows stdout

转载 作者:可可西里 更新时间:2023-11-01 13:24:51 25 4
gpt4 key购买 nike

如何在 Windows 上将 \n 打印到标准输出?此代码适用于 Python 2,但不适用于 Python 3:

# set sys.stdout to binary mode on Windows
import sys, os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

# the length of testfile created with
# python test_py3k_lf_print.py > testfile
# below should be exactly 4 symbols (23 0A 23 0A)
print("#\n#")

最佳答案

Python 3 已经在二进制模式下配置了标准 I/O,但它有自己的 I/O 实现来进行换行符转换。您可以手动调用 sys.stdout.buffer.write 以使用二进制模式 BufferedWriter print。如果您需要使用 print,那么您将需要一个不使用通用换行符的新文本 I/O 包装器。例如:

stdout = open(sys.__stdout__.fileno(), 
mode=sys.__stdout__.mode,
buffering=1,
encoding=sys.__stdout__.encoding,
errors=sys.__stdout__.errors,
newline='\n',
closefd=False)

由于 closefd 为假,关闭此文件不会关闭原始的 sys.stdout 文件描述符。您可以通过 print("#\n#", file=stdout) 显式使用此文件,或替换 sys.stdout = stdout。原始版本作为 sys.__stdout__ 提供。

背景

Python 3 的 io 模块旨在为抽象基类方面的所有类文件对象提供跨平台和跨实现(CPython、PyPy、IronPython、Jython)规范 RawIOBaseBufferedIOBaseTextIOBase。它在 _pyio 模块中包含一个引用纯 Python 实现。原始 io.FileIO 实现的共同点是一组低级 POSIX 系统调用,例如 readwrite,这消除了CRT stdio 不一致的问题。在 Windows 上,POSIX 层只是 CRT 的低 I/O 层,但至少这仅限于单一平台的怪癖。

Windows 的一个怪癖是在其 POSIX I/O 层中具有非标准文本和二进制模式。 Python 通过始终使用二进制模式并在 stdio 文件描述符 1 上调用 setmode 来解决这个问题。

Python 可以通过实现 RawIOBaseWinFileIO 注册子类来避免将 Windows CRT 用于 I/O。 issue 12939 中有一个建议的补丁.另一个例子是 win_unicode_console模块,它实现了 WindowsConsoleRawReaderWindowsConsoleRawWriter 类。


<子>1. 这给嵌入 Python 并期望 stdio 使用默认文本模式的程序带来了问题。例如,在二进制模式下打印宽字符字符串不再像在 ANSI 文本模式下那样转换为 char,而且它肯定不会像在 ANSI 文本模式下那样使用 WriteConsoleW 打印在 UTF-16 文本模式下。例如:

Python 2.7.10 (default, May 23 2015, 09:44:00) 
[MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, os, msvcrt, ctypes
>>> ctypes.cdll.msvcr90.wprintf(b'w\x00i\x00d\x00e\x00\n\x00')
wide
5
>>> msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
16384
>>> ctypes.cdll.msvcr90.wprintf(b'w\x00i\x00d\x00e\x00\n\x00')
w i d e
5

关于windows - 使用 Python 3 将 LF 打印到 Windows stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34960955/

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