Python打印到stdout在集群作业失败时丢失

1 投票
1 回答
725 浏览
提问于 2025-04-18 02:26

我有一段Python代码,正在一个计算机集群上运行。当代码出错(或者被取消等)时,默认的输出(也就是通过print打印的内容)会消失。而且,当我在调用相关代码后立即查看输出文件时,也看不到这些内容。

不过,当任务失败时,错误输出(stderr)会被打印出来。如果我没记错的话,在C++中可以使用flush来确保缓冲区里的输出被实际打印出来。那么在Python中有没有类似的办法呢?我该如何确保尽快获取这些输出呢?


这是我代码的一个示意图

for it in somerange:
    print "Iteration", it       # This appears much later in stdout
    f = open(filename[it], 'w')
    f.write('stuff')
    f.close                     # file appears when it is closed
    otherStuff()

经过几次迭代后,我会有很多输出文件(来自filename),但我的stdout文件里却没有任何输出。如果函数otherStuff()导致崩溃(等),输出出现在我的stderr文件中,但我的stdout文件里仍然什么都没有。

1 个回答

1

好的,print这个命令会把内容输出到一个叫做 sys.stdout 的地方,这个地方其实是一个 文件对象。你可以在这个文件对象上使用 flush() 这个命令。所以,正确的做法是在需要的时候加上 flush() 的调用,也就是说:

import sys
...
for it in somerange:
    print "Iteration", it       # This appears much later in stdout
    sys.stdout.flush()
    f = open(filename[it], 'w')
    f.write('stuff')
    f.close                     # file appears when it is closed
    otherStuff()

撰写回答