Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在程序中使用python中的无缓冲标准输出(如python-u)_Python - Fatal编程技术网

在程序中使用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
更容易。