miz*_*miz 5 python qsub sungridengine
我有一个SGE脚本来执行一些python代码,使用qsub提交到队列.在python脚本中,我有一些打印语句(更新程序的进度).当我从命令行运行python脚本时,print语句被发送到stdout.对于sge脚本,我使用-o选项将输出重定向到文件.但是,似乎脚本只会在python脚本运行完毕后将这些文件发送到文件中.这很烦人,因为(a)我不能再看到程序的实时更新和(b)如果我的工作没有正确终止(例如,如果我的工作被踢出队列),则不会打印任何更新.每次我想打印一些东西时,如何确保脚本正在写入文件,而不是在最后将它们全部混合在一起?
我认为你遇到了缓冲输出的问题.Python使用一个库来处理它的输出,并且库知道在不与tty交谈时编写块的效率更高.
有几种方法可以解决这个问题.您可以使用"-u"选项运行python(有关详细信息,请参阅python手册页),例如,将此类内容作为脚本的第一行:
#! /usr/bin/python -u
Run Code Online (Sandbox Code Playgroud)
但如果您使用"/ usr/bin/env"技巧,这不起作用,因为您不知道python的安装位置.
另一种方法是用这样的东西重新打开stdout:
import sys
import os
# reopen stdout file descriptor with write mode
# and 0 as the buffer size (unbuffered)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
Run Code Online (Sandbox Code Playgroud)
请注意,os.fdopen的bufsize参数设置为0以强制它为无缓冲.您可以使用sys.stderr执行类似的操作.
正如其他人所提到的,当没有连接到tty时,并不总是写stdout是出于性能原因.
如果您有一个特定的点,您希望写入stdout,您可以通过使用强制它
import sys
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
在那时候.
| 归档时间: |
|
| 查看次数: |
3189 次 |
| 最近记录: |