我正在使用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)
之后我使用stdin发出我的代码:
proc.StandardInput.WriteLine(myCode+";;"+Environment.NewLine)
proc.StandardInput.Flush()
这适用于带有标准设置的VisualStudio的Windows 7 - 不幸的是它在linux上不起作用(ubuntu 11.04,Mono JIT编译器版本2.6.7(Debian 2.6.7-5ubuntu3),F#,Microsoft(R)F#2.0 Interactive build 2.0.0.0)[注意:从源代码构建的单声道2.10也是如此]。 无论如何,StandardOutput在两个平台上都能正常工作。
编辑:澄清如何/什么不起作用:在收到标准启动输出(F#,Microsoft(R)F#...)后,我通过重定向输入流发送一些代码(让我们说让foo x = x * 2) 。使用重定向输出同步(在另一个线程中)接收答案(使用proc.StandardOut.ReadLine()但ReadLine永远不会返回!
我怀疑fsharpi正在运行的(额外进程)单声道问题或平台问题(换行符等)。
排除第二种可能性我试过手动管道。为此,我创建了一个包含内容的文件:
"#quit;;[NEWLINE]"
其中[NEWLINE代表Unix端线和Windows风格EOL]
使用以下命令(windows):
fsi.exe < thefileDescribedAbove
或分别(linux)
fsharpi < thefileDescribedAbove
像预期的那样它可以在Windows上运行(打开FSI并立即退出)但在linux上停顿(比如;;或者没有收到NEWLINE)。
鉴于此测试中的奇怪结果,我怀疑我的方法存在一个更基本的问题(希望不是)。
非常感谢
答案 0 :(得分:2)
(实际上我很久以前就尝试过了 - 显然我当时对我的测试搞砸了)