LINUX.ORG.RU

[Python][socket][Popen] пересылка стандартного вывода

 ,


0

1

Есть некий скрипт, который че та пишет на стандартный вывод и в поток ошибок. Скрипт запускается питоном, нужно то че он пишет передать через сокет клиенту, который это дело будет выкидывать в форточку по мере поступления. Вопрос - как это Ъ сделать? Сокет до и после используется для передачи инструкций и других данных.

Скрипт запускается Popen-ом, можно передать ему сокет в качестве stdout и stderr и все работает, но возникает проблема на стороне клиента - непонятно нифига скока данных записано в сокет, когда и сколько их доставать и пр. Клиент кроссплатформенный, тестится под линукс но работать должен в основном под виндой.

Обычно я любые данные сопровождаю заголовком, в котором указана длина передачи. Что бы такой заголовок втыкать надо бы предать не сокет а некую обертку над сокетом, которая эмулирует файловый объект и эти заголовки выткает, но вот беда - Popen при привязке юзает файловые дескрипторы, как сэмулирорвать на питоне файловый объект и перехватывать то что по дескриптору валится я не знаю... печаль в общем.

★★★★★

можно передать ему сокет в качестве stdout и stderr и все работает, но возникает проблема на стороне клиента - непонятно нифига скока данных записано в сокет, когда и сколько их доставать и пр.

1) Сокет можно сделать неблокирующимся.

2) Цикл чтения можно организовать по месту вызова Popen, а клиенту скармливать уже хорошие данные (с заголовками и т.д.)

baverman ★★★
()

1. Используй пайпы для общения с процессом они ж для этого предназначены.

2. при отправке по сокету - сделай самодельный протокол - ну типа 4 байта длинна а потом данные. и так передавай каждый кусок прочитанный из пайпа. размер пайпа в линуксе по дефолту 65536. И да, в линуксах максимальная производительность будет при перегоне из пайпа в сокет с использованием splice(). в офтопике - не знаю.

mmarkk
()
Ответ на: комментарий от baverman

Вот я тоже про это думал, но как то нерешительно... Я могу читать из попеновского stdout и пересылать дальше в сокет, вопрос как читать? Не по байту же... по строкам - фигня, там в логах часто встречается \r (что бы в экране не засорять в одной строке крутится что то типа прогрессбара). Туплю чего то;-(

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

вопрос как читать?

Если питон, который запускает скрипт, работает под никсами, то проблем никаких нет. Переводим proc.stdout в O_NONBLOCK и спокойненько вычитываем в цикле, блочась на select'е.

Если нужна кроссплатформенность, то есть костылек:

http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subpr...

Выглядит достаточно жутко, но другого решения, видимо, нет.

baverman ★★★
()
Ответ на: комментарий от baverman

Зашибись! Я его победил, спасибо большое;-)

А у select есть какие-то подводные камни при работе в питоновской нити?

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.