2010-08-08 5 views
1

Я пытаюсь создать .NET-обертку для REPL (в частности, Scheme, но я не добрался туда, где это важно). Я искал какую-то библиотеку ожидающего стиля, но я не мог ее найти, поэтому я использовал System.Diagnostics.Process. Я не думаю, что мне удастся правильно читать и писать.Как поместить REPL с помощью .NET?

Это мой код; это в 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 »).

ответ

2

Я нашел ответ: мне нужно вставить

prc.StandardOutput.DiscardBufferedData() 

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

 Смежные вопросы

  • Нет связанных вопросов^_^