C#Mono过程输入错误

时间:2016-07-04 22:35:38

标签: c# shell process mono

Hello StackOverflow用户我正在尝试编写一些代码来打开一个新的控制台/终端窗口,启动GnuPlot,执行gnuplot命令,然后使用plot sin(x)绘制正弦函数。

请注意,只有在gnuplot命令中运行它时才会打印出来。 GnuPlot程序是一种Python shell,如果你还没有得到图片。

问题

我可以让它执行gnuplot只是很好,它在当前窗口运行命令(不是这个问题的问题,但随时解决它! )但它不会将plot sin(x)识别为命令。我的猜测是它执行gnuplot并以某种方式退出GnuPlot shell并返回到正常的控制台模式。

注意:我使用的是KUbuntu 16.04 LTS。

代码

public void Plot() {
        // GetCommand() always returns "gnuplot" for now.

        ProcessStartInfo pInfo = new ProcessStartInfo("/bin/bash", String.Format("-c {0};plot sin(x)", GetCommand())) {
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            CreateNoWindow = true,
            UseShellExecute = false
        }; 

        Process process = new Process () { StartInfo = pInfo };

        process.Start ();
    }

控制台返回错误:sin(x): plot: command not found

我尝试了什么

要用; plot sin(x)替换&& plot sin(x),会返回相同的错误。

要使用行process.StandardInput.WriteLine ("plot sin(x)");写入StandardInput,但它会抛出 System.InvalidOperationException 通知Standard input has not been redirected甚至我在ProcessStartInfo上重定向它!

1 个答案:

答案 0 :(得分:1)

您可以使用fifo文件作为gnuplot的输入文件,然后写入该文件以提供gnuplot脚本命令。

man mkfifo了解详情)

实施例

Process.Start("mkfifo", "/tmp/plotpipe");
var pInfo = new ProcessStartInfo(@"/usr/local/bin/gnuplot", "/tmp/plotpipe")
{
    RedirectStandardInput = false,
    RedirectStandardOutput = false,
    CreateNoWindow = true,
    UseShellExecute = false
};
var process = new Process() { StartInfo = pInfo };
process.Start();
using (StreamWriter file = new StreamWriter(@"/tmp/plotpipe", false))
{
    file.Write("print sum [i=1:10] i");
}
Process.Start("rm", "/tmp/plotpipe");

输出:

55.0

Press any key to continue...