Найти - Пользователи
Полная версия: subprocess
Начало » Центр помощи » subprocess
1 2
Farsatanis
Всем привет. Есть функция которая юзает 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 - все работает. Собственно вопрос следующий: можно ли , а если можно , то как , запустив данный “скрипт” в терминале , приджониться к потоку вывода ,чтобы перехватить его и куды нито отправить?
Budulianin
Farsatanis
приджониться к потоку вывода ,чтобы перехватить его и куды нито отправить?
у тебя в f находится вывод, сразу его и отправляй
Farsatanis
Т.е , грубо говоря что то такое будет работать корректоно ?
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

Но тут именно построчно.
Rodegast
> Т.е , грубо говоря что то такое будет работать корректоно ?

Крнечно нет. Я бы смотрел в сторону генераторов.
Farsatanis
Ок , тогда вот так.
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
То оно все выведет , и будет ждать дальнейших строк А мне нужно , чтобы был именно какой то ,наверное ,список, чтобы с ним в дальнейшем взаимодействовать, но при этом должно остаться чтобы этот список пополнялся.
Наврное я расписал все совершенно непонятно ….
Rodegast
> Ок , тогда вот так.
Цикл убери , readline - метод.

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

В чём проблема?
spisok = []
for i in tail():
    spisok.append(i)
    # И дальше взаимодействуешь
Farsatanis
Наверное я чета не догоняю просто : На данный момент моя шизонутая функция эмулирует tail -f ,ну или где то рядом(без генератора) : выводятся последние стрки фала, и она продолжает висеть - ждать новых поступлений в stdout.

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

>он засунет в список только то , что уже было в stdout и список ждет следующихз пополненй.
А тебе что надо?
Farsatanis
Может оно и прально избивиться от True …. проблем сразу станет меньше.
А нужен мне вееееесь stdout ,а не его кусочки
Farsatanis
Все, сделал. По крайней мере выглядит так как надо
Спасибо)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB