Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2013 10:29:14

Farsatanis
Зарегистрирован: 2013-08-09
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess

Всем привет. Есть функция которая юзает subprocess :

def tail_f():
    f = subprocess.Popen(['tail','-F','/home/defremov/Viewer/file1'],\
        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    while True:
        sleep(1)    
        print f.stdout.readline()
Тупой tail - все работает. Собственно вопрос следующий: можно ли , а если можно , то как , запустив данный “скрипт” в терминале , приджониться к потоку вывода ,чтобы перехватить его и куды нито отправить?

Офлайн

#2 Ноя. 6, 2013 11:14:43

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

subprocess

Farsatanis
приджониться к потоку вывода ,чтобы перехватить его и куды нито отправить?
у тебя в f находится вывод, сразу его и отправляй



Офлайн

#3 Ноя. 6, 2013 11:20:06

Farsatanis
Зарегистрирован: 2013-08-09
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess

Т.е , грубо говоря что то такое будет работать корректоно ?

def tail_f():
    f = subprocess.Popen(['tail','-F','/home/defremov/Viewer/file1'],\
        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    while True:
        sleep(1)    
        print f.stdout.readline()
        return f.stdout.readline

Но тут именно построчно.

Офлайн

#4 Ноя. 6, 2013 11:43:43

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

subprocess

> Т.е , грубо говоря что то такое будет работать корректоно ?

Крнечно нет. Я бы смотрел в сторону генераторов.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Ноя. 6, 2013 12:08:53

Farsatanis
Зарегистрирован: 2013-08-09
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess

Ок , тогда вот так.

def tail_f():
    f = subprocess.Popen(['tail','-F','/home/defremov/Viewer/file1'],\
        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    while True:
        sleep(1)    
    yield f.stdout.readline
Теперь я как бы могу это использовать , но проблема в следующем: как только я попробую сделать , как то так :
for i in tail():
 print i
То оно все выведет , и будет ждать дальнейших строк А мне нужно , чтобы был именно какой то ,наверное ,список, чтобы с ним в дальнейшем взаимодействовать, но при этом должно остаться чтобы этот список пополнялся.
Наврное я расписал все совершенно непонятно ….

Офлайн

#6 Ноя. 6, 2013 12:57:10

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

subprocess

> Ок , тогда вот так.
Цикл убери , readline - метод.

> А мне нужно , чтобы был именно какой то ,наверное ,список, чтобы с ним в дальнейшем взаимодействовать, но при этом должно остаться чтобы этот список пополнялся.

В чём проблема?

spisok = []
for i in tail():
    spisok.append(i)
    # И дальше взаимодействуешь



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Ноя. 6, 2013 13:12:00

Farsatanis
Зарегистрирован: 2013-08-09
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess

Наверное я чета не догоняю просто : На данный момент моя шизонутая функция эмулирует tail -f ,ну или где то рядом(без генератора) : выводятся последние стрки фала, и она продолжает висеть - ждать новых поступлений в stdout.

Если убрать цикл , то будет выводиттся только первая строка.
И опять же

spisok = []
for i in tail():
    spisok.append(i)
опять не катит - он засунет в список только то , что уже было в stdout и список ждет следующихз пополненй.
И да, там пара опечаток в коде

Отредактировано Farsatanis (Ноя. 6, 2013 13:12:31)

Офлайн

#8 Ноя. 6, 2013 13:23:59

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

subprocess

>Если убрать цикл , то будет выводиттся только первая строка.
Имелось в виду

while True:
        sleep(1)

>он засунет в список только то , что уже было в stdout и список ждет следующихз пополненй.
А тебе что надо?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Ноя. 6, 2013 13:32:51

Farsatanis
Зарегистрирован: 2013-08-09
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess

Может оно и прально избивиться от True …. проблем сразу станет меньше.
А нужен мне вееееесь stdout ,а не его кусочки

Офлайн

#10 Ноя. 6, 2013 14:23:09

Farsatanis
Зарегистрирован: 2013-08-09
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess

Все, сделал. По крайней мере выглядит так как надо
Спасибо)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version