Мне нужен способ либо прочитать все доступные в настоящий момент символы в потоке, создаваемом Popen, либо узнать, сколько символов осталось в буфере.
Backround: Я хочу удаленно управлять интерактивным приложением в Python. До сих пор я использовал Popen для создания нового подпроцесса:
process=subprocess.Popen(["python"],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, cwd=workingDir)
(Я действительно не запускаю python, но реальный интерактивный интерфейс похож.) В настоящий момент я читаю 1 байт, пока не обнаруживаю, что процесс достиг команды командной строки:
output = ""
while output[-6:]!="SCIP> ":
output += process.stdout.read(1)
sys.stdout.write(output[-1])
return output
Затем я начинаю длительное вычисление через process.stdin.write("command\n")
.
Моя проблема в том, что я не могу проверить, закончилось ли вычисление или нет, потому что я не могу проверить, являются ли последние символы в потоке приглашением или нет. read()
или read(n)
блокирует мой поток до тех пор, пока он не достигнет EOF, чего никогда не будет, потому что интерактивная программа не закончится до тех пор, пока не будет сказано. Поиск запроса в том, как этот цикл не работает, также не будет работать, потому что подсказка появится только после вычисления.
Идеальное решение позволило бы мне прочитать весь доступный символ из потока и сразу же вернуть пустую строку, если читать нечего.