The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"python перенаправление stdout"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "python перенаправление stdout"  
Сообщение от NuINu (??) on 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()

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру