在程序中使用python中的无缓冲标准输出(如python-u)
可能重复:在程序中使用python中的无缓冲标准输出(如python-u),python,Python,可能重复: 有没有办法从我的代码中获得运行python-u的效果?如果失败,我的程序是否可以检查它是否在-u模式下运行,如果没有,则退出并显示错误消息?这是在linux(Ubuntu8.10服务器上)假设您在Windows上: msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 。。。在Unix上: fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL) fl |= os.O_SYNC fcntl
有没有办法从我的代码中获得运行python-u的效果?如果失败,我的程序是否可以检查它是否在-u模式下运行,如果没有,则退出并显示错误消息?这是在linux(Ubuntu8.10服务器上)假设您在Windows上:
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
。。。在Unix上:
fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC
fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl)
(Unix从已注释的解决方案中复制,而不是链接。)编辑(2020年10月)。正如中所指出的,在Python3中,stderr也是缓冲的
您可以利用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()
我能想到的最好的办法是:
>>> import os
>>> import sys
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> unbuffered.write('test')
test>>>
>>> sys.stdout = unbuffered
>>> print 'test'
test
在GNU/Linux上测试。它似乎也应该在Windows上工作。如果我知道如何重新打开sys.stdout,就会容易得多:
sys.stdout = open('???', 'w', 0)
参考文献:[编辑]
请注意,在覆盖sys.stdout之前最好先关闭它。您可以始终在shebang行中传递-u参数:
#!/usr/bin/python -u
对不起,忘了加那个。在linux(ubuntu)上@Martin DeMello:请不要在评论中添加新的事实。请用新的事实更新你的问题。注释中的新事实很难找到。在unix、linux和任何posix上都受支持:注意,这不适用于python2(没有错误,输出仍然是缓冲的)。当使用错误的解释器运行脚本时发现,但是一个非常可爱的解释器:)如果您需要单独的、但很好的ideathank,那么它实际上不起作用。至于分离:你不可能得到全部,是吗:)“strer永远不会被缓冲”-不再是真的;在python3中,如果是tty,则stderr是行缓冲的;如果是文件或管道,则stderr是完全缓冲的。请参阅标题:1。OP知道这件事;2.作者暗示使用命令行,而不是表示熟悉shell(shebang)提供的替代调用。不过,感谢您的宝贵反馈。这似乎不适用于“环境技巧”<代码>#/usr/bin/env python-u。我得到以下错误
/usr/bin/env:python-u:没有这样的文件或目录
。如果我删除-u
,它会再次工作。为了继续我刚才的评论,我认为这解释了我的问题:(我又一次!)。下面是我在上面两条评论中讨论的问题的解决方案:。(是的,这与原来的问题无关)stdout
仍然存在于sys中。请注意,这在Py3K中不起作用<代码>值错误:不能有无缓冲文本I/O
另一种解决方法设置为任何非空字符串。这不在您的代码中-必须在python解释器启动之前设置-但比修改启动脚本的任何内容以添加-u
更容易。