.net – 如何使用带有fsharpi(fsi)和mono的stdin管道
我使用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.0fsi.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也是如此]. 编辑:澄清如何/什么不起作用:在收到标准启动输出(F#,Microsoft(R)F#…)后,我通过重定向输入流发送一些代码(让我们说让foo x = x * 2).使用重定向输出同步(在另一个线程中)接收答案(使用proc.StandardOut.ReadLine()但ReadLine永远不会返回! 我怀疑fsharpi正在运行的(额外进程)mono或平台问题(换行等)是一个问题. 为了排除我尝试手动管道的第二种可能性.为此,我创建了一个包含内容的文件: "#quit;;[NEWLINE]" 其中[NEWLINE代表Unix端言和Windows风格EOL] 使用以下命令(窗口): fsi.exe < thefileDescribedAbove 或者分别(linux) fsharpi < thefileDescribedAbove 像预期的那样它可以在Windows上运行(打开FSI并立即退出)但是在linux上停止(例如;;或者没有收到NEWLINE). 非常感谢 解决方法
经过长期无意义的bughunt:fsi的“–readline-”参数解决了这个问题!感谢所有追踪此事:-)
(实际上我很久以前就试过这个 – 显然我当时用我的测试搞砸了一些东西) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |