如何将stdout重定向到Python中的任意文件?
当一个长时间运行的Python脚本(例如,web应用程序)从ssh会话和backgounded中启动,并且ssh会话关闭时,应用程序将引发IOError并在试图写入stdout时失败。我需要找到一种方法,使应用程序和模块输出到一个文件,而不是标准输出,以防止由于IOError而失败。目前,我使用nohup将输出重定向到一个文件,这就完成了工作,但出于好奇,我想知道是否有一种方法可以在不使用nohup的情况下完成这项工作。
我已经尝试过sys.stdout = open('somefile', 'w')
,但这似乎并不能阻止某些外部模块仍然输出到终端(或者sys.stdout = ...
行根本没有触发)。我知道它应该从我测试过的更简单的脚本开始工作,但是我还没有时间在web应用程序上测试。
你可以试试这个
如果要在Python脚本中进行重定向,那么将
sys.stdout
设置为file对象就可以:更常见的方法是在执行时使用shell重定向(在Windows和Linux上相同):
Python 3.4中有^{} function :
它类似于:
可以在早期的Python版本上使用。后一个版本不是reusable。如果需要的话可以做一个。
它不会在文件描述符级别重定向stdout,例如:
b'not redirected'
和'echo this also is not redirected'
不会重定向到output.txt
文件。要在文件描述符级别重定向,可以使用
os.dup2()
:如果使用
stdout_redirected()
而不是redirect_stdout()
,则现在也可以使用相同的示例:只要
stdout_redirected()
上下文管理器处于活动状态,以前在stdout上打印的输出现在就转到output.txt
。注意:
stdout.flush()
不刷新 Python 3上的C stdio缓冲区,其中I/O直接在read()
/write()
系统调用上实现。要刷新所有打开的C stdio输出流,如果某些C扩展使用基于stdio的I/O,则可以显式调用libc.fflush(None)
:可以使用
stdout
参数重定向其他流,而不仅仅是sys.stdout
,例如,合并sys.stderr
和sys.stdout
:示例:
注意:
stdout_redirected()
混合了缓冲I/O(通常是sys.stdout
)和非缓冲I/O(直接对文件描述符进行操作)。小心,可能有bufferingissues。要回答这个问题,您可以使用^{} 对脚本进行守护,并使用
logging
模块(作为@erikb85 suggested)而不是print
语句,只需重定向您现在使用nohup
运行的长期运行的Python脚本的stdout。相关问题 更多 >
编程相关推荐