Как использовать stdin pipe с fsharpi (fsi) и моно - PullRequest
5 голосов
/ 28 августа 2011

Я использую fsharpi (fsi) в качестве фонового процесса компиляции, используя System.Diagnostics.Process для запуска процесса.Моя установка ProcessStartInfo выглядит следующим образом:

let psi = new ProcessStartInfo()
psi.UseShellExecute <- false
if System.Environment.OSVersion.Platform = PlatformID.Unix
    then
        psi.FileName <- "/usr/bin/mono"
        psi.Arguments <- "/usr/lib/fsharp/fsi.exe"
    else
        psi.FileName <- @"C:\Program Files (x86)\Microsoft F#\v4.0\fsi.exe"
        psi.Arguments <- ""
psi.WorkingDirectory <- "some workdir"
psi.CreateNoWindow <- true
psi.RedirectStandardError <- true
psi.RedirectStandardInput <- true
psi.RedirectStandardOutput <- true

Мой процесс создается следующим образом:

let proc = Process.Start(psi)

Впоследствии я использую стандартный ввод для вывода моего кода:

proc.StandardInput.WriteLine(myCode+";;"+Environment.NewLine)
proc.StandardInput.Flush()

это работаетв Windows 7 с VisualStudio со стандартной настройкой - к сожалению, он не работает в Linux (Ubuntu 11.04, Mono JIT-компилятор версии 2.6.7 (Debian 2.6.7-5ubuntu3), F #, Microsoft (R) F # 2.0 Интерактивная сборка 2.0.0.0)[Примечание: то же самое для моно 2.10, построенного из источника].Так или иначе, StandardOutput работает на обеих платформах просто отлично.

РЕДАКТИРОВАТЬ: выяснить, как / что не работает: после получения стандартного запуска запуска (F #, Microsoft (R) F # ...) я отправляю некоторый код (скажем,пусть foo x = x * 2) через перенаправленный входной поток.Ответ получен синхронно (в другом потоке) с использованием перенаправленного вывода (с использованием proc.StandardOut.ReadLine (), но ReadLine никогда не возвращается!

Я подозреваю, что это проблема с (дополнительным процессом) mono, в котором fsharpiили проблема с платформой (новая строка и т. д.).

Чтобы исключить вторую возможность, я попробовал ручные каналы. Для этого я создал файл с содержимым:

"#quit;;[NEWLINE]"

, где [NEWLINE обозначаетдля конечных линий Unix и стиля Windows EOL]

с помощью следующей команды (windows):

fsi.exe < thefileDescribedAbove

или соответственно (linux)

fsharpi < thefileDescribedAbove

, как и ожидалось, работает в Windows(открывает FSI и немедленно завершает работу), но останавливается в linux (например, ;; или NEWLINE не получено). Учитывая странный результат в этом тесте, я подозреваю более фундаментальную проблему с моим подходом (надеюсь, нет).

спасибомного

1 Ответ

2 голосов
/ 09 сентября 2011

после долгого бессмысленного промаха: аргумент "--readline-" для fsi решает проблему! Спасибо всем за это: -)

(на самом деле я пробовал это давным-давно - очевидно, я что-то напутал с моим тестом в то время)

...