如何将 stdin 管道与 fsharpi (fsi) 和 mono 一起使用

发布于 2024-12-01 15:15:14 字数 1745 浏览 1 评论 0原文

我使用 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 正在运行的(额外进程)mono 的问题或平台问题( 为了排除第二种可能性,

我尝试了手动管道,其中内容为:

"#quit;;[NEWLINE]"

[NEWLINE 代表 Unix endlines 和 windows 样式 EOL]

使用以下命令(windows):

fsi.exe < thefileDescribedAbove

或 分别。 (linux)

fsharpi < thefileDescribedAbove

就像预期的那样,它在 Windows 上工作(打开 FSI 并立即退出),但在 Linux 上停止(如 ;; 或未收到 NEWLINE)。 鉴于此测试中的奇怪结果,我怀疑我的方法存在更根本的问题(希望不是)。

多谢

i am using fsharpi (fsi) as background compiling process using System.Diagnostics.Process to spawn the process. My ProcessStartInfo Setup looks like:

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

my Process is created like:

let proc = Process.Start(psi)

afterwards i use stdin to emit my code:

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

this works on Windows 7 with VisualStudio with standard setup - unfortunately it does not work on linux (ubuntu 11.04, Mono JIT compiler version 2.6.7 (Debian 2.6.7-5ubuntu3), F#, Microsoft (R) F# 2.0 Interactive build 2.0.0.0) [Note: same for mono 2.10 built from source].
Anyhow StandardOutput works on both platforms just fine.

EDIT: to clarify how/what does not work: after receiving standard startup output (F#, Microsoft (R) F#...) i send some code (lets say let foo x = x * 2) via redirected input stream. The answer is received synchronously (in another thread) using redirected output (using proc.StandardOut.ReadLine() but ReadLine never returns!

I suspect it is a problem with (the extra process) mono in which fsharpi is running or a platform issue (newline etc).

To rule out the second possibility i tried manual pipes. To do so i created a file with content:

"#quit;;[NEWLINE]"

whereby [NEWLINE stands for Unix endlines and windows style EOL]

using following command (windows):

fsi.exe < thefileDescribedAbove

or respectively (linux)

fsharpi < thefileDescribedAbove

like expected it works on Windows (opens FSI and quits immediately) but stalls on linux (like ;; or NEWLINE is not received).
Given the strange result in this test i suspect a more fundamental problem with my approach (hopefully not).

thanks a lot

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

听闻余生 2024-12-08 15:15:14

经过长时间无意义的 bughunt: fsi 的“--readline-”参数解决了问题!感谢所有的跟踪:-)

(实际上我很久以前就尝试过这个 - 显然我当时的测试搞砸了)

after a long senseless bughunt: "--readline-" argument to fsi fixes the problem! thanks to all tracking this down :-)

(actually i tried this a long time ago - apparently i messed something up with my test at that time)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文