Найти - Пользователи
Полная версия: subprocess.communicate
Начало » Python для новичков » subprocess.communicate
1 2
asilyator
Хрень какаета этот субпроцесс. Рекомендовано юзать communicate, но
p = Popen([exefile], shell=False, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT)
p.communicate('1\n2\n3\n')
После communicate() процесс закрывается. Как считывать построчно файл, скармливать по строке программе и читать ответ (аналог exefile < file.in | python file.py)?
Андрей Светлов
Нет, ну вы документацию читать умеете? communicate - именно на один раз.
Хотите построчно - копируйте реализацию communicate себе и правьте как вам нужно.
asilyator
Андрей Светлов
Хотите построчно - копируйте реализацию 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.
Ждет завершения процесса! И ни слова про циклы.

Жизнь несовершенна. Я как бы намекал, что изучение исходников .communicate может натолкнуть на мысль, почему все сделано так а не иначе.
asilyator
Заняться чтоли онанизмом с select или неблокирующими хэндлами, аки с сокетами?
asilyator
Андрей Светлов
Жизнь несовершенна. Я как бы намекал, что изучение исходников .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:
....
Так любая обезьяна может, вот только с производительностью проблема будет.
asilyator
Программа выдает на строчку входа строчку выхода.
>>> p = Popen(["grep.exe",'""'], shell=False, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT)
>>> p.stdin.write("a\n")
>>> p.stdout.next()
Виснет. ЧЯДНТ?
o7412369815963
может попробовать p.stdout.readline()
asilyator
Те же яйца.
Андрей Светлов
Ну что же вы? Пытались рассуждать как совсем взрослый, а на такой ошибочке споткнулись…

Кто вам сказал, что grep работает именно построчно? Закроете stdin - все будет хорошо. Получите ухудшенную версию .communicate

В качестве разминки попробуйте представить систему, в которой чтение из stdin должно чередоваться с записью в stdout.
У нее куча логических противоречий. Написать для конкретного случая можно, в общем виде - не решается.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB