Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2011 08:13:09

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

subprocess.communicate

Хрень какаета этот субпроцесс. Рекомендовано юзать 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)?



Офлайн

#2 Фев. 26, 2011 11:44:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

subprocess.communicate

Нет, ну вы документацию читать умеете? communicate - именно на один раз.
Хотите построчно - копируйте реализацию communicate себе и правьте как вам нужно.



Офлайн

#3 Фев. 26, 2011 11:52:45

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

subprocess.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.



Офлайн

#4 Фев. 26, 2011 12:05:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

subprocess.communicate

Я бы в первую очередь обратил внимание на

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 может натолкнуть на мысль, почему все сделано так а не иначе.



Офлайн

#5 Фев. 26, 2011 12:38:45

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

subprocess.communicate

Заняться чтоли онанизмом с select или неблокирующими хэндлами, аки с сокетами?



Офлайн

#6 Фев. 26, 2011 12:46:50

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

subprocess.communicate

Андрей Светлов
Жизнь несовершенна. Я как бы намекал, что изучение исходников .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:
....
Так любая обезьяна может, вот только с производительностью проблема будет.



Офлайн

#7 Фев. 26, 2011 13:05:23

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

subprocess.communicate

Программа выдает на строчку входа строчку выхода.

>>> p = Popen(["grep.exe",'""'], shell=False, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT)
>>> p.stdin.write("a\n")
>>> p.stdout.next()
Виснет. ЧЯДНТ?



Офлайн

#8 Фев. 26, 2011 14:20:46

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

subprocess.communicate

может попробовать p.stdout.readline()

Офлайн

#9 Фев. 26, 2011 14:58:46

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

subprocess.communicate

Те же яйца.



Офлайн

#10 Фев. 26, 2011 16:06:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

subprocess.communicate

Ну что же вы? Пытались рассуждать как совсем взрослый, а на такой ошибочке споткнулись…

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

В качестве разминки попробуйте представить систему, в которой чтение из stdin должно чередоваться с записью в stdout.
У нее куча логических противоречий. Написать для конкретного случая можно, в общем виде - не решается.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version