Форум сайта python.su
Никак не могу заставить работать программу. Она сокращена до минимума,
#!/usr/bin/python
import sys
import time
while True:
line = sys.stdin.readline()
sys.stdout.write(line)
time.sleep(1)
%(echo test; sleep 3) | dzen2
%(echo test; sleep 3) | filter.py | dzen2
Офлайн
У вас в программе бесконечный цикл. Так надо?
Офлайн
Прямо стесняюсь спросить: права на запуск filter.py стоят?
И еще попробуйте добавить после sys.stdout.write(line)
sys.stdout.flush()
Офлайн
PooHОгромное спасибо! Действительно помогло sys.stdout.flush()
Прямо стесняюсь спросить: права на запуск filter.py стоят?
И еще попробуйте добавить после sys.stdout.write(line)
sys.stdout.flush()
Офлайн
Возникла еще одна проблема. Я добавил к строке line текущие дату и время, чтобы оно обновлялось раз в секунду но оказалось что sys.stdin.readline() блокирует программу пока не получит строку. Как его обойти?
Офлайн
ЮрчекМожно добавить в конец line ‘\n’ - он его ждет
Возникла еще одна проблема. Я добавил к строке line текущие дату и время, чтобы оно обновлялось раз в секунду но оказалось что sys.stdin.readline() блокирует программу пока не получит строку. Как его обойти?
Офлайн
Нет. Обновленная программа
#!/usr/bin/python
import sys
import time
import datetime
while True:
line = sys.stdin.readline()
if line:
outline = line
try:
sys.stdout.write('%s %s' % (datetime.datetime.now(), outline))
sys.stdout.flush()
except NameError:
pass
time.sleep(1)
%tail -n 1 -f file.log | filter.py
Офлайн
Вы хотите отдавать в каждом цикле последнюю прочитанную строку вне зависимости было в этом цикле чтение или нет? Тогда вам надо выносить чтение в отдельный поток.
Офлайн
Спасибо. Разобрался без потоков. Чтение с стандартного ввода можно сделать не блокируемым. Вот образец.
import os
import fcntl
# make stdin a non-blocking file
fd = sys.stdin.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NONBLOCK)
try:
line = sys.stdin.readline()
except:
pass
Отредактировано (Апрель 15, 2010 12:29:09)
Офлайн