Ответ пересмотрен на основе комментариев
Если ваша цель - постоянно читать файл, который получает записи из вывода другого процесса, у вас есть пара аспектов, которые необходимо решить...
- Вам либо нужно периодически читать файл, который постоянно перезаписывается, либо вам нужно сопоставить вывод файла, к которому добавляются, с новыми значениями.
- Ваш скрипт в настоящее время блокируется, когда вы запускаете цикл событий 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)
...
...
Надеюсь, что вы начали!