URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7540
[ Назад ]

Исходное сообщение
"python перенаправление stdout"

Отправлено birst , 12-Авг-08 18:53 
День добрый ,
есть такая задача , в программе запускается другая программа (утилита поиска вирусов)
она должна запускаться в фоновом режиме и вывод(stdout) этой утилиты должен "пернаправляться" в мою программу и уже она делает с ним все что угодно.
подскажите куда смотреть
пробовал popen2 + thread, но там идеологически не выходит
тк дискриптор стдаут становится таковым после того как вызов закончится
спасибо

Содержание

Сообщения в этом обсуждении
"python перенаправление stdout"
Отправлено NuINu , 13-Авг-08 11:59 
вот пример, файл 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()