Я пытаюсь сделать обертку.NET для REPL (конкретно Схема, но я не имею туда, где она имеет значение). Я искал своего рода ожидать-библиотеку-стилей, но я не мог найти один, таким образом, я использовал Систему. Диагностика. Процесс. Я не думаю, что успешно выполняюсь при чтении и записи правильно.
Вот мой код; это находится в IronPython, но у меня были подобные результаты в C#:
from System.Diagnostics import *
def get_process(cmd):
psi = ProcessStartInfo()
psi.RedirectStandardOutput = True
psi.RedirectStandardInput = True
psi.RedirectStandardError = True
psi.UseShellExecute = False
psi.FileName = cmd
prc = Process()
prc.StartInfo = psi
return prc
def read_to_prompt(prc):
output = ""
while prc.StandardOutput.Peek() > 0:
output += chr(prc.StandardOutput.Read())
return output
prc = get_process("racket.exe")
prc.Start()
print read_to_prompt(prc)
prc.StandardInput.WriteLine("(+ 3 15)\n")
prc.StandardInput.Flush()
print read_to_prompt(prc)
prc.Kill()
И вот вывод:
Welcome to Racket v5.0.1
C:\home>
Я ожидал бы, что это в конечном счете позволит мне читать подсказку (что-то как"> "), и результат выражения, которое я ввел (" (+ 3 15)" должен возвратиться "18").
Я нашел ответ:
prc.StandardOutput.DiscardBufferedData()
мне нужно было вставить
prc.StandardOutput.DiscardBufferedData()
перед повторной попыткой чтения. StreamReader часто буферизирует больше данных, чем вы читаете, и если поток изменен, он не обязательно об этом узнает.