Ответ изменен на основе комментариев
Если ваша цель состоит в том, чтобы постоянно читать файл, который получает записи из выходных данных другого процесса, у вас есть пара аспектов, которые необходимо решить...
- Вам либо нужно периодически читать файл, который постоянно перезаписывается, либо вам нужно отслеживать вывод файла, к которому добавляются новые значения.
- Ваш скрипт в настоящее время блокируется, когда вы запускаете цикл событий pyglet, поэтому эта проверка файла должна быть в другом потоке, а затем вам нужно будет сообщить о событии обновления.
Я не могу полностью прокомментировать шаг 2, потому что я никогда не использовал pyglet и не знаком с тем, как он использует события или сигналы. Но я могу хотя бы половину предложить с нитью.
Вот очень простой пример использования потока для чтения файла и сообщения о найденной строке:
import time
from threading import Thread
class Monitor(object):
def __init__(self):
self._stop = False
def run(self, inputFile, secs=3):
self._stop = False
with open(inputFile) as monitor:
while True:
line = monitor.readline().strip()
if line.isdigit():
# this is where you would notify somehow
print int(line)
time.sleep(secs)
if self._stop:
return
def stop(self):
self._stop = True
if __name__ == "__main__":
inputFile = "write.txt"
monitor = Monitor()
monitorThread = Thread(target=monitor.run, args=(inputFile, 1))
monitorThread.start()
try:
while True:
time.sleep(.25)
except:
monitor.stop()
Цикл ожидания в конце кода — это просто способ эмулировать ваш цикл событий и блок.
Вот тест, чтобы показать, как это будет работать. Сначала я открываю оболочку Python и открываю новый файл:
>>> f = open("write.txt", 'w+', 10)
Затем вы можете запустить этот скрипт. И снова в оболочке можно начинать писать строки:
>>> f.write('50\n'); f.flush()
В вашем скриптовом терминале вы увидите, что он читает и печатает строки.
Другой способ: если ваш процесс, который записывает в этот файл, постоянно перезаписывает его, вместо этого вы просто перечитаете файл, установив monitor.seek(0)
и вызвав readline().
Опять же, это очень простой пример для начала. Я уверен, что есть более продвинутые способы решения этой проблемы. Следующим шагом будет выяснить, как вы можете сигнализировать циклу событий pyglet для вызова метода, который изменит ваш источник видео.
Обновить
Вам следует просмотреть этот раздел документации pyglet о том, как создать собственный диспетчер событий: http://pyglet.org/doc/programming_guide/creating_your_own_event_dispatcher.html
Опять же, без особых знаний о pyglet, вот как это может выглядеть:
class VideoNotifier(pyglet.event.EventDispatcher):
def updateIndex(self, value):
self.dispatch_events('on_update_index', value)
VideoNotifier.register_event('on_update_index')
videoNotifier = VideoNotifier()
@videoNotifier.event
def on_update_index(newIndex):
# thread has notified of an update
# Change the video here
pass
И для вашего класса потока вы должны передать экземпляр диспетчера и использовать событие updateIndex() для уведомления:
class Monitor(object):
def __init__(self, dispatcher):
self._stop = False
self._dispatcher = dispatcher
def run(self, inputFile, secs=3):
...
...
# should notify video of new value
line = int(line_from_file)
self._dispatcher.updateIndex(line)
...
...
Надеюсь, это поможет вам начать!
person
jdi
schedule
26.02.2012