将换行符写入 sys.stdout 时,使 Python 停止发出回车符

Posted

技术标签:

【中文标题】将换行符写入 sys.stdout 时,使 Python 停止发出回车符【英文标题】:Make Python stop emitting a carriage return when writing newlines to sys.stdout 【发布时间】:2012-04-18 16:54:25 【问题描述】:

我在 Windows 上,Python (非常有效地)阻止我向 STDOUT 发送独立的 '\n' 字符。比如下面会输出foo\r\nvar

sys.stdout.write("foo\nvar")

如何关闭此“功能”?首先写入文件不是一种选择,因为输出是通过管道传输的。

【问题讨论】:

你目前使用的是什么代码? 无论 sys.stdout 是用什么打开的。 我的意思是你用什么来写它? print? sys.stdout.write()? 【参考方案1】:

在写任何东西之前尝试以下操作:

import sys

if sys.platform == "win32":
   import os, msvcrt
   msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

如果你只想暂时改成二进制模式,可以自己写一个wrapper:

import sys
from contextlib import contextmanager

@contextmanager
def binary_mode(f):
   if sys.platform != "win32":
      yield; return

   import msvcrt, os
   def setmode(mode):
      f.flush()
      msvcrt.setmode(f.fileno(), mode)

   setmode(os.O_BINARY)
   try:
      yield
   finally:
      setmode(os.O_TEXT)

with binary_mode(sys.stdout), binary_mode(sys.stderr):
   # code

【讨论】:

@John:相差 4 秒 :D 猜我们都使用了相同的搜索词 ;) “这是一个非常快速的谷歌搜索的结果”,只是在我以使搜索更容易的方式表达问题之后。我花了大约一个小时寻找“让python停止发出回车”,所以我来到了这里。 @John:哦,这不是冒犯的意思,抱歉。我还花了几个小时研究一些东西,最后才指向一个链接,该链接必须在我的 一些 查询的前 10 个结果中,但我只是碰巧没有点击。有时这取决于运气 :) 玩得开心!【参考方案2】:

Add 'r' before the string:

sys.stdout.write(r"foo\nvar")

正如预期的那样,它也适用于打印。

【讨论】:

啊,它会打印反斜杠和 n 字面意思吗?

以上是关于将换行符写入 sys.stdout 时,使 Python 停止发出回车符的主要内容,如果未能解决你的问题,请参考以下文章

python中sys.stdoutsys.stdin

python中sys.stdoutsys.stdin

sys.stdout.flush() 方法的使用

python中模拟进度条

Python 标准输出 sys.stdout 重定向

如何使已打开的文件可读(例如 sys.stdout)?