У меня есть функция, которая преобразует входной файл в пользовательский формат.
Я хочу, чтобы пользователь мог запустить этот сценарий в одном терминале, чтобы просмотреть обработанный вывод с помощью пейджера.
Когда он редактирует исходный файл в другом терминале и сохраните, эти изменения следует повторно отобразить и обновить в пейджере.
Обнаружение этих изменений и их повторная отрисовка работает. Проблема в обновлении пейджера.
После недолгих поисков я обнаружил, что less можно сделать такую перезагрузку при нажатии 'R':
R Repaint screen, discarding buffered input.
Поэтому я попытался реализовать это поведение в своем коде:
pager_process = subprocess.Popen(['less', filepath], stdin=subprocess.PIPE)
...
pager_process.stdin.write(b'R') # HERE: this should reload less but doesn't
Но это не сработало.
Есть идеи или более глубокие знания, о которых я не знаю?< /p>
Исходный код
source = Path(source) # some sort of input file
def render_source() -> str:
try:
return convert(fp=source) # renders the input-file in a wished format
except SyntaxError as error:
return '\n'.join(traceback.format_exception(type(error), error, error.__traceback__)) # in case rendering fails
def update_tmpfile(new: str) -> None:
tmp.truncate(0)
tmp.seek(0)
tmp.write(new)
tmp.flush()
with tempfile.NamedTemporaryFile('w+') as tmp:
last_mtime = source.stat().st_mtime_ns
content = render_source()
update_tmpfile(content)
pager_process = subprocess.Popen(['less', tmp.name], stdin=subprocess.PIPE)
try:
while pager_process.poll() is None: # not exited
time.sleep(0.1)
current_mtime = source.stat().st_mtime_ns
if last_mtime != current_mtime: # source changed -> rerender
last_mtime = current_mtime
content = render_source()
update_tmpfile(content)
pager_process.stdin.write(b'R') # HERE: this should reload less but doesn't
except Exception:
pager_process.kill()
raise
Подробнее здесь: https://stackoverflow.com/questions/784 ... as-process