Форум сайта python.su
Хрень какаета этот субпроцесс. Рекомендовано юзать communicate, но
p = Popen([exefile], shell=False, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT)
p.communicate('1\n2\n3\n')
Офлайн
Нет, ну вы документацию читать умеете? communicate - именно на один раз.
Хотите построчно - копируйте реализацию communicate себе и правьте как вам нужно.
Офлайн
Андрей СветловС каких пор копипейст считается хорошей техникой программирования?
Хотите построчно - копируйте реализацию communicate себе и правьте как вам нужно.
Warning: Use communicate() rather than .stdin.write, .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.
Офлайн
Я бы в первую очередь обратил внимание на
Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate.Ждет завершения процесса! И ни слова про циклы.
Офлайн
Заняться чтоли онанизмом с select или неблокирующими хэндлами, аки с сокетами?
Офлайн
Андрей СветловА что тут военного то.
Жизнь несовершенна. Я как бы намекал, что изучение исходников .communicate может натолкнуть на мысль, почему все сделано так а не иначе.
p.stdin.write('asd\n')
p.stdin.write('asd\n')
p.stdin.write('asd\n')
p.stdin.write('asd\n')
p.stdin.write('asd\n')
p.stdin.close()
for line in p.stdout:
....
Офлайн
Программа выдает на строчку входа строчку выхода.
>>> p = Popen(["grep.exe",'""'], shell=False, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT)
>>> p.stdin.write("a\n")
>>> p.stdout.next()
Офлайн
может попробовать p.stdout.readline()
Офлайн
Те же яйца.
Офлайн
Ну что же вы? Пытались рассуждать как совсем взрослый, а на такой ошибочке споткнулись…
Кто вам сказал, что grep работает именно построчно? Закроете stdin - все будет хорошо. Получите ухудшенную версию .communicate
В качестве разминки попробуйте представить систему, в которой чтение из stdin должно чередоваться с записью в stdout.
У нее куча логических противоречий. Написать для конкретного случая можно, в общем виде - не решается.
Офлайн