вот пример, файл redir_stdout.py:
#!/usr/bin/python
# -*- coding: koi8-r -*-import sys
import os
def main():
log_stream = open("t2.log", 'a');
STDOUT = sys.stdout.fileno()
#получили новый файловый объект с новым дескриптором > 2, но по прежнему указывающий на открытый файл терминала
new_base_stdout_d = os.dup(STDOUT)
base_stdout = os.fdopen(new_base_stdout_d, 'w')
#теперь на дискрипторе STDOUT откроем файловый объект(а верее, просто сдублируем дескриптор уже открытого файла), а старый поток закроем
os.dup2(log_stream.fileno(), STDOUT)
log_stream.close()
print "Привет новый STDOUT!!!"
print >>base_stdout, "Привет старый STDOUT"
print "-------------------------------------------------------------"
#надо сбросить буфера, иначе они запишуться после вывода дочернего процесса(можно конечно при открытии сделать буфер поменьше)
sys.stdout.flush()
os.system('cat redir_stdout.py')
print "-------------------------------------------------------------"
#возвращаем старый stdout, ------------ это можно вообще не делать.----------------------------------------------------------
#хотя на самом деле!!! его дескриптор не равен STDOUT и внешние программы попрежнему будут выводить в файл!!!(если конечно мы их будем вызывать)
#sys.stdout = base_stdout
#если хочеться вернуть, и значение дескр оставить STDOUT, финтим так. сбросим буфер, и сдублируем дескриптор
sys.stdout.flush()
os.close(sys.stdout.fileno())
os.dup2(new_base_stdout_d, STDOUT)
base_stdout.close()
print "О, возвращен старый STDOUT!!!"
if __name__ == "__main__":
main()