Я пытаюсь перенаправить stdin и stdout консольного приложения, чтобы я мог взаимодействовать с ними через F #. Однако в зависимости от консольного приложения очевидный код, похоже, терпит неудачу. Следующий F # код работает для dir
, но не (зависает) для python
и fsi
:Перенаправление stdin и stdout в .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()
Это висит питона, но работает реж.
Это связано с использованием python и fsi с использованием readline или я делаю очевидную ошибку? Есть ли работа, которая позволила бы мне взаимодействовать с fsi или python REPL из F #?
Это идеальный вариант, за исключением того я все еще возился вокруг, пытаясь выяснить, как найти то, что где каждый выход команды начинается и заканчивается. Разделение на> не кажется очень надежным. Я пробовал передавать «-fsi-server: test» в качестве аргумента, и, похоже, я не получаю «SERVER-PROMPT>». Есть идеи? – Tristan
К сожалению, в FSI нет возможности узнать, выполняется ли команда, отличная от ожидающей отображения '>', что явно не является надежным. (Это становится еще сложнее при нерестах асинхронных задач, которые переживают выполнение задачи.) Для автоматизации мы используем следующую эвристику: wait for "\ r \ n>" && никакой новый вывод не был написан для второй или более. –
Спасибо. fsiserver.fs, похоже, работает над IPC, но неясно, как использовать его, как оболочку VS. – Tristan