?

Log in

No account? Create an account
Вопрос к питонцам - My World and Welcome To It (Don't Litter)
March 6th, 2015
04:58 pm

[Link]

Previous Entry Share Next Entry
Вопрос к питонцам

Потихоньку осваиваю Python. Есть такая проблема:

Имеется некая консольная (Windows) программа, которая в цикле читает строчку из stdin и выдает ответ в stdout, тоже в виде строчки. Мне нужно пообщаться с ней из программы на Питоне.


from subprocess import Popen, PIPE
pipe = Popen('Schmoker.exe', stdout=PIPE, stdin=PIPE)

while True:
  request = raw_input(">> Enter your request: ")
  pipe.stdin.write(request + '\n')
  answer = pipe.stdout.read()
  print(">> answer: " + answer)


Такое решение не работает, потому что pipe.stdout.read() ждет, когда stdout закроется. Как правильно организовать диалог?

Tags:

(5 comments | Leave a comment)

Comments
 
[User Picture]
From:maasau
Date:March 7th, 2015 12:06 am (UTC)
(Link)
Я абсолютно не знаю питон, но имею 10 чёрных поясов по программированию 10 лет назад учился на программиста.
Вместо read, попробовал бы какой-нить readline или что там есть для чтения кусками.
[User Picture]
From:siberian_cat
Date:March 7th, 2015 01:42 am (UTC)
(Link)
Я пробовал, не работает.
[User Picture]
From:maasau
Date:March 7th, 2015 01:54 am (UTC)
(Link)
Видимо программа что вызывается гадит не в stdout, это возможно.
У меня всё заработало:

sanek@hp:~/tmp$ cat upper.ksh
#!/bin/ksh

while read str
do
 echo $str |  tr -s '[:lower:]' '[:upper:]'
done


sanek@hp:~/tmp$ cat std.py
from subprocess import Popen, PIPE
pipe = Popen('/export/home/sanek/tmp/upper.ksh', stdout=PIPE, stdin=PIPE)

while True:
  request = raw_input(">> Enter your request: ")
  pipe.stdin.write(request + '\n')
  answer = pipe.stdout.readline()
  print(">> answer: " + answer)


sanek@hp:~/tmp$ python std.py
>> Enter your request: asdlkfj
>> answer: ASDLKFJ

>> Enter your request: x,mcnv
>> answer: X,MCNV

>> Enter your request: wqeproi
>> answer: WQEPROI

>> Enter your request: asdf
>> answer: ASDF

[User Picture]
From:siberian_cat
Date:March 7th, 2015 03:02 am (UTC)
(Link)
А, я понял, в чем дело: вызываемая программа по умолчанию буферизует вывод. Вставил fflush(stdout), и всё заработало.

Спасибо за тест.
[User Picture]
From:maasau
Date:March 7th, 2015 03:10 am (UTC)
(Link)
Поздравляю!
Powered by LiveJournal.com