Я только что столкнулся с подобной проблемой с SGE, и не предлагал метод для "снятия буфера" файла IO, который, казалось, работал для меня.Мне пришлось ждать до конца выполнения программы, чтобы увидеть какие-либо выходные данные.
Обходной путь, который я нашел, заключался в том, чтобы обернуть sys.stdout в пользовательский объект, который повторно реализует метод write.Вместо фактической записи в стандартный вывод этот новый метод вместо этого открывает файл, куда перенаправляется ввод-вывод, добавляет необходимые данные и затем закрывает файл.Это немного уродливо, но я нашел, что это решило проблему, так как фактическое открытие / закрытие файла заставляет IO быть интерактивным.
Вот минимальный пример:
import os, sys, time
class RedirIOStream:
def __init__(self, stream, REDIRPATH):
self.stream = stream
self.path = REDIRPATH
def write(self, data):
# instead of actually writing, just append to file directly!
myfile = open( self.path, 'a' )
myfile.write(data)
myfile.close()
def __getattr__(self, attr):
return getattr(self.stream, attr)
if not sys.stdout.isatty():
# Detect redirected stdout and std error file locations!
# Warning: this will only work on LINUX machines
STDOUTPATH = os.readlink('/proc/%d/fd/1' % os.getpid())
STDERRPATH = os.readlink('/proc/%d/fd/2' % os.getpid())
sys.stdout=RedirIOStream(sys.stdout, STDOUTPATH)
sys.stderr=RedirIOStream(sys.stderr, STDERRPATH)
# Simple program to print msg every 3 seconds
def main():
tstart = time.time()
for x in xrange( 10 ):
time.sleep( 3 )
MSG = ' %d/%d after %.0f sec' % (x, args.nMsg, time.time()-tstart )
print MSG
if __name__ == '__main__':
main()