python中的无缓冲的stdout(如在python -u中)来自程序内部

Mar*_*llo 53 python

可能重复:
Python输出缓冲

有没有办法从我的代码中获得运行python -u的效果?如果失败了,我的程序可以检查它是否在-u模式下运行并退出并显示错误消息,如果没有?这是在linux上(ubuntu 8.10服务器)

Bas*_*ard 45

我能想到的最好的:

>>> import os
>>> import sys
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> unbuffered.write('test')
test>>> 
>>> sys.stdout = unbuffered
>>> print 'test'
test
Run Code Online (Sandbox Code Playgroud)

在GNU/Linux上测试过.它似乎也适用于Windows.如果我知道如何重新打开sys.stdout,那将更容易:

sys.stdout = open('???', 'w', 0)
Run Code Online (Sandbox Code Playgroud)

参考文献:
http://docs.python.org/library/stdtypes.html#file-objects
http://docs.python.org/library/functions.html#open
http://docs.python.org/library/ os.html#文件对象创建

[编辑]

请注意,在覆盖之前关闭sys.stdout可能会更好.

  • 请注意,这在Py3K中不起作用.`ValueError:不能有无缓冲的文本I/O` (13认同)
  • 这个问题的答案已经过时了。请参阅链接问题以获取 Python 3.3+ 答案:/sf/ask/7539381/ (2认同)

mik*_*ers 26

你总是可以在shebang行中传递-u参数:

#!/usr/bin/python -u
Run Code Online (Sandbox Code Playgroud)

  • 见标题:1.OP了解它; 2.想以编程方式进行. (18认同)
  • 作者暗示命令行使用,并不表示熟悉shell(shebang)提供的备用调用.谢谢您的有用反馈. (18认同)
  • 这似乎不适用于"env技巧".`#!/ usr/bin/env python -u`.我得到以下错误`/ usr/bin/env:python -u:没有这样的文件或目录`.如果我删除`-u`它再次起作用. (8认同)
  • (又是我!)。这是我在上面的两条评论中讨论的那个问题的解决方案:http://stackoverflow.com/questions/17458528/why-does-this-snippet-work。(但是,是的,这与此处的原始问题无关) (2认同)
  • 正如 Aaron 所说,直接将选项添加到 shebang 中是行不通的。相反,将 `-S` 选项传递给 `env` 命令,如下所示:`#!/usr/bin/env -S python3 -u` (2认同)

Ric*_*dle 6

假设你在Windows上:

msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
Run Code Online (Sandbox Code Playgroud)

......在Unix上:

fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC
fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl)
Run Code Online (Sandbox Code Playgroud)

(Unix从注释解决方案中复制而不是链接.)

  • @Martin DeMello:请不要在评论中添加新的事实.请用新的事实更新您的问题.评论中的新事实很难找到. (4认同)

Bor*_*lik 5

您可能会使用以下事实:stderr从不缓冲并尝试将stdout重定向到stderr:

import sys
#buffered output is here
doStuff()

oldStdout = sys.stdout
sys.stdout = sys.stderr
#unbuffered output from here on

doMoreStuff()
sys.stdout = oldStdout

#the output is buffered again
doEvenMoreStuff()
Run Code Online (Sandbox Code Playgroud)

  • 一个黑客,但一个非常可爱的:)如果你需要你的stderr单独但好主意,它真的不起作用 (3认同)
  • “stderr 永远不会被缓冲” - 不再正确;在 python3 中,stderr 如果是 tty,则为行缓冲;如果为文件或管道,则为全缓冲。 (2认同)