Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 14, 2010 15:46:11

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Никак не могу заставить работать программу. Она сокращена до минимума,

#!/usr/bin/python

import sys
import time
while True:
line = sys.stdin.readline()
sys.stdout.write(line)
time.sleep(1)
Задача сделать обертку для dzen2 - такая программа для вывода ввиде строки статусов всяких мониторов под линукс. Она читает построчно стандартный ввод и выводит его на себя.
Например так выведет строку test. ( задержка добавлена для наглядности)
%(echo test; sleep 3) | dzen2
А если посередине поставить еще и мой скрипт на питоне, то ничего не выводит
%(echo test; sleep 3) | filter.py | dzen2



Офлайн

#2 Апрель 14, 2010 20:14:40

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

У вас в программе бесконечный цикл. Так надо?



Офлайн

#3 Апрель 15, 2010 05:27:47

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Прямо стесняюсь спросить: права на запуск filter.py стоят?
И еще попробуйте добавить после sys.stdout.write(line)
sys.stdout.flush()



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Апрель 15, 2010 09:24:48

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

PooH
Прямо стесняюсь спросить: права на запуск filter.py стоят?
И еще попробуйте добавить после sys.stdout.write(line)
sys.stdout.flush()
Огромное спасибо! Действительно помогло sys.stdout.flush()



Офлайн

#5 Апрель 15, 2010 10:01:57

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Возникла еще одна проблема. Я добавил к строке line текущие дату и время, чтобы оно обновлялось раз в секунду но оказалось что sys.stdin.readline() блокирует программу пока не получит строку. Как его обойти?



Офлайн

#6 Апрель 15, 2010 10:06:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Юрчек
Возникла еще одна проблема. Я добавил к строке line текущие дату и время, чтобы оно обновлялось раз в секунду но оказалось что sys.stdin.readline() блокирует программу пока не получит строку. Как его обойти?
Можно добавить в конец line ‘\n’ - он его ждет



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Апрель 15, 2010 10:42:25

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Нет. Обновленная программа

#!/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
должна выводить раз в секунду последнюю строку, которую смогла прочитать. Но она ждет ввода.



Офлайн

#8 Апрель 15, 2010 11:37:17

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Вы хотите отдавать в каждом цикле последнюю прочитанную строку вне зависимости было в этом цикле чтение или нет? Тогда вам надо выносить чтение в отдельный поток.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Апрель 15, 2010 12:28:41

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите разобраться с вводом выводом

Спасибо. Разобрался без потоков. Чтение с стандартного ввода можно сделать не блокируемым. Вот образец.

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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version