Вынудите стандартный вывод другой программы быть освобожденным буфер с помощью Python

Одна вещь люди продолжает не учитывать: при покупке используемого Mac удостоверьтесь, что это - Intel Mac, не PPC. iPhone SDK официально не работает на аппаратных средствах PPC.

13
задан grrussel 9 October 2009 в 14:15
поделиться

5 ответов

Это возможно, но единственное решение, которое я могу придумать, довольно запутанное, непереносимое и, вероятно, связано с проблемными деталями. Вы можете использовать LD_PRELOAD, чтобы внешнее приложение загружало динамическую библиотеку, которая содержит конструктор, который вызывает setvbuf для отмены буферизации stdout. Вы, вероятно, также захотите обернуть setvbuf в библиотеке, чтобы приложение не могло явно буферизовать свой собственный stdout. И вы захотите обернуть fwrite и printf, чтобы они сбрасывались при каждом вызове. Написание .so для предварительной загрузки выведет вас за пределы Python.

5
ответ дан 1 December 2019 в 23:32
поделиться

Вы можете использовать PTY для решения этой проблемы:

  • Создание пары главный / подчиненный pty;
  • Соединение stdin, stdout и stderr дочернего процесса с подчиненным устройством pty;
  • ] Чтение и запись в мастер pty в родительском элементе.
6
ответ дан 1 December 2019 в 23:32
поделиться

Я не думаю, что это возможно. Если исходное приложение не очищает свой исходящий буфер, данные не попадут за пределы этого процесса до тех пор, пока буфер не переполнится и не будет принудительно очищен.

Обратите внимание на то, как хорошо известная команда, такая как файл , имеет опция (-n), которая заставляет его явно сбрасывать свой вывод. Это необходимо при использовании файла в режиме, когда он считывает имена входных файлов из канала и печатает обнаруженный тип. Так как в этом режиме файловая программа не завершает работу по завершении, в противном случае вывод не будет отображаться.

Рассмотрим это на более низком уровне: буферизация вывода просто означает, что выполнение write () на Буферизованный поток копирует данные в буфер в памяти, пока буфер не заполнится или (обычно) пока не будет найден перевод строки. Потом,

3
ответ дан 1 December 2019 в 23:32
поделиться

Стоит отметить, что некоторые программы буферизуют свой вывод только тогда, когда они думают, что он не отправляется «реальному пользователю» (то есть tty). Когда они обнаруживают, что их вывод читается другой программой, они буферизируются.

Эмуляция tty - одна из вещей, которые Expect делает при автоматизации других процессов.

Существует

1110720] реализация Expect на чистом Python, но я не знаю, насколько хорошо она обрабатывает эмуляцию tty.

2
ответ дан 1 December 2019 в 23:32
поделиться

Try running the Python interpreter with the -u argument:

python -u myscript.py

This forces Python to use unbuffered stdin/stdout which may help you.

-1
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: