如何从 Mathematica 调用交互式 D 进程?
How to call an interactive D process from Mathematica?
我正在尝试使用 Mathematica 的 StartProcess 与另一个进程建立交互式会话。它与 this question 中的场景基本相同,只是我调用的是 D 程序而不是 Fortran 程序。
以交互方式从标准输入读取并写入标准输出的最小 D 程序为例(注意无限循环):
// D
void main(string[] argv) {
while(true) {
auto name = readln().chomp;
writefln("Hello %s!", name);
}
}
当我从命令提示符 运行 这个程序时,它的行为符合预期。如果我想从 Mathematica 运行 它,这应该有效:
(* Mathematica *)
dhello = StartProcess["dhello.exe"];
WriteLine[dhello, "Wulfrick"];
ReadLine[dhello]
但事实并非如此。对 ReadLine[] 的调用阻塞,就好像在等待进程完成一样。我最初认为这可能是 Mathematica 中的问题,但我尝试改为调用 C# 程序并且它起作用了!举个例子:
// C#
static void Main(string[] args) {
while (true) {
var name = Console.ReadLine();
Console.WriteLine($"Hello {name}!");
}
}
现在在 Mathematica 方面,正在做:
(* Mathematica *)
cshello = StartProcess["cshello.exe"];
WriteLine[cshello, "Wulfrick"];
ReadLine[cshello]
按预期工作,我一调用 ReadLine[] 就打印输出并保持交互性。所以看起来问题确实出在 D 方。这也是为什么我决定在这里 post 而不是 mathematica.stackexchange.
我真的很想用 D 程序使它工作。非常感谢任何输入。
系统:
- Windows 10 x64
- 数学 11.2
- DMD v2.078.2
标准输出可能没有被刷新。
尝试:
import std.stdio : stdout;
stdout.flush();
在你的 while 循环结束时。
我正在尝试使用 Mathematica 的 StartProcess 与另一个进程建立交互式会话。它与 this question 中的场景基本相同,只是我调用的是 D 程序而不是 Fortran 程序。
以交互方式从标准输入读取并写入标准输出的最小 D 程序为例(注意无限循环):
// D
void main(string[] argv) {
while(true) {
auto name = readln().chomp;
writefln("Hello %s!", name);
}
}
当我从命令提示符 运行 这个程序时,它的行为符合预期。如果我想从 Mathematica 运行 它,这应该有效:
(* Mathematica *)
dhello = StartProcess["dhello.exe"];
WriteLine[dhello, "Wulfrick"];
ReadLine[dhello]
但事实并非如此。对 ReadLine[] 的调用阻塞,就好像在等待进程完成一样。我最初认为这可能是 Mathematica 中的问题,但我尝试改为调用 C# 程序并且它起作用了!举个例子:
// C#
static void Main(string[] args) {
while (true) {
var name = Console.ReadLine();
Console.WriteLine($"Hello {name}!");
}
}
现在在 Mathematica 方面,正在做:
(* Mathematica *)
cshello = StartProcess["cshello.exe"];
WriteLine[cshello, "Wulfrick"];
ReadLine[cshello]
按预期工作,我一调用 ReadLine[] 就打印输出并保持交互性。所以看起来问题确实出在 D 方。这也是为什么我决定在这里 post 而不是 mathematica.stackexchange.
我真的很想用 D 程序使它工作。非常感谢任何输入。
系统:
- Windows 10 x64
- 数学 11.2
- DMD v2.078.2
标准输出可能没有被刷新。
尝试:
import std.stdio : stdout;
stdout.flush();
在你的 while 循环结束时。