Stdin подпроцесса не работает с less как процессPython

Программы на Python
Anonymous
Stdin подпроцесса не работает с less как процесс

Сообщение Anonymous »

У меня есть функция, которая преобразует входной файл в пользовательский формат.
Я хочу, чтобы пользователь мог запустить этот сценарий в одном терминале, чтобы просмотреть обработанный вывод с помощью пейджера.
Когда он редактирует исходный файл в другом терминале и сохраните, эти изменения следует повторно отобразить и обновить в пейджере.
Обнаружение этих изменений и их повторная отрисовка работает. Проблема в обновлении пейджера.
После недолгих поисков я обнаружил, что 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

Вернуться в «Python»