Estoy tratando de redirigir stdin y stdout de una aplicación de consola, para que pueda interactuar con ellos a través de F #. Sin embargo, dependiendo de la aplicación de la consola, el código obvio parece fallar. El siguiente código C# funciona para dir
pero falla (se bloquea) para python
y fsi
:Redireccionando stdin y stdout en .Net
open System
open System.Diagnostics
let f = new Process()
f.StartInfo.FileName <- "python"
f.StartInfo.UseShellExecute <- false
f.StartInfo.RedirectStandardError <- true
f.StartInfo.RedirectStandardInput <- true
f.StartInfo.RedirectStandardOutput <- true
f.EnableRaisingEvents <- true
f.StartInfo.CreateNoWindow <- true
f.Start()
let line = f.StandardOutput.ReadLine()
Este cuelga para Python, pero funciona para dir.
¿Esto tiene que ver con python y fsi usando readline o estoy cometiendo un error obvio? ¿Hay algún trabajo que me permita interactuar con fsi o python REPL desde F #?
Esto es perfecto, excepto todavía estoy jugando alrededor tratando de encontrar la manera de encontrar lo que cada salida del comando comienza y termina. Dividir en> no parece muy robusto. He intentado pasar "--fsi-server: test" como argumento y parece que no recibo "SERVER-PROMPT>". ¿Algunas ideas? – Tristan
Desgraciadamente, no hay manera de saber en FSI si se ejecuta un comando que no sea esperar a que se muestre '>', que obviamente no es tan robusto. (Esto se vuelve incluso más complejo cuando se generan tareas asíncronas que sobreviven a la ejecución de la tarea). Para la automatización utilizamos la siguiente heurística: esperar a "\ r \ n>" && no se ha escrito ninguna salida durante un segundo o más. –
Gracias. fsiserver.fs parece funcionar sobre IPC, pero no es obvio cómo usarlo como el shell VS. – Tristan