Форум сайта python.su
Давай на ты, а то это вы/ты выглядит немного странно.
Андрей СветловУгу, а теперь запусти grep “” и вводи по сторочке с клавиатуры.
Ну что же вы? Пытались рассуждать как совсем взрослый, а на такой ошибочке споткнулись…
Кто вам сказал, что grep работает именно построчно? Закроете stdin - все будет хорошо. Получите ухудшенную версию .communicate
Андрей СветловОтлично, но как ты представляешь сабж, если через него надо програть данные на x0 Mb? Или такой случай невозможен?
В качестве разминки попробуйте представить систему, в которой чтение из stdin должно чередоваться с записью в stdout.
У нее куча логических противоречий. Написать для конкретного случая можно, в общем виде - не решается.
Офлайн
Хорошо. А ты grep как запускал? Просто grep pattern?
Смотрим исходники. Ооо. Для не-tty терминала (наш случай, запуск из subprocess.Popen) работает чуть иначе, чем для консольки.
Если нужно обработать много - нет проблем.
Для grep случай простой - запись и чтение идут независимо. Действительно, можно прикрутить select и нормально все обрабатывать.
Если захотим порулить gdb (а все отладчики в linux как раз gdb и запускают, никто не пытается делать работу самому) - ситуация немного сложнее.
Особенность в том, что после write в stdin нужно как-то узнать, сколько байт следует вычитать в ответе из stdout.
Специально для этого в gdb разработали serial protocol - c пакетами, контрольными суммами и так далее. С оговоренным протоколом все сразу стало гораздо проще, неопределенность исчезла.
Поэтому я и написал, что в общем виде не решается. И communicate поэтому такой простой. Это как с сокетами. Пока не изобретешь формат общения - что-то толковое сделать нелегко.
Офлайн
Ну у меня задача проще - на каждую строчку ввода должна быть строчка вывода, причем связывать их друг с другом может быть даже и не надо.
С селектом гиморноватей, конечно. Примеров я не нашел.
Андрей СветловСуть остается та же - никто не ждет конца потока, результат выдается по мере поступления ввода.
Для не-tty терминала (наш случай, запуск из subprocess.Popen) работает чуть иначе, чем для консольки.
Офлайн
Для select все просто. Но на Windows как раз select использовать нельзя - он не работает с PIPE.
В результате, кажется, приходится плясать с бубном вокруг WaitForMultipleObject.
Написать код не могу - мне его проверять не на чем.
Офлайн
Андрей СветловЭто такой тонко замаскированый вендекапец++?
Написать код не могу - мне его проверять не на чем.
Офлайн
У меня Убунта. Виндовую виртуалку крепко сломал пару недель назад. Восстанавливать пока не было особой нужды.
Неблокирующие хэндлы? Отчего бы и нет, если тебе так удобней.
Как ты правильно заметил, полноценное общение с запущенным процессом очень похоже на сокеты. И да, грабли те же.
Офлайн
asilyator, смотри http://www.python.org/dev/peps/pep-3145/
Специально под тебя делано.
Офлайн
Вроде greenlet/stackless здесь поможет.
А syncless ещё и патч для subprocess имеет.
..bw
Офлайн