Найти - Пользователи
Полная версия: помогите разобраться с вводом выводом
Начало » Python для новичков » помогите разобраться с вводом выводом
1
Юрчек
Никак не могу заставить работать программу. Она сокращена до минимума,
#!/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
Ed
У вас в программе бесконечный цикл. Так надо?
PooH
Прямо стесняюсь спросить: права на запуск filter.py стоят?
И еще попробуйте добавить после sys.stdout.write(line)
sys.stdout.flush()
Юрчек
PooH
Прямо стесняюсь спросить: права на запуск filter.py стоят?
И еще попробуйте добавить после sys.stdout.write(line)
sys.stdout.flush()
Огромное спасибо! Действительно помогло sys.stdout.flush()
Юрчек
Возникла еще одна проблема. Я добавил к строке line текущие дату и время, чтобы оно обновлялось раз в секунду но оказалось что sys.stdin.readline() блокирует программу пока не получит строку. Как его обойти?
PooH
Юрчек
Возникла еще одна проблема. Я добавил к строке line текущие дату и время, чтобы оно обновлялось раз в секунду но оказалось что sys.stdin.readline() блокирует программу пока не получит строку. Как его обойти?
Можно добавить в конец line ‘\n’ - он его ждет
Юрчек
Нет. Обновленная программа
#!/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
должна выводить раз в секунду последнюю строку, которую смогла прочитать. Но она ждет ввода.
PooH
Вы хотите отдавать в каждом цикле последнюю прочитанную строку вне зависимости было в этом цикле чтение или нет? Тогда вам надо выносить чтение в отдельный поток.
Юрчек
Спасибо. Разобрался без потоков. Чтение с стандартного ввода можно сделать не блокируемым. Вот образец.
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
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