Как я переношу REPL использование.NET?

Я пытаюсь сделать обертку.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").

1
задан JasonFruit 8 August 2010 в 12:32
поделиться

1 ответ

Я нашел ответ:

prc.StandardOutput.DiscardBufferedData()

мне нужно было вставить

prc.StandardOutput.DiscardBufferedData()

перед повторной попыткой чтения. StreamReader часто буферизирует больше данных, чем вы читаете, и если поток изменен, он не обязательно об этом узнает.

2
ответ дан 2 September 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: