在c#中捕获python脚本的运行时异常和输出

时间:2013-07-17 14:13:32

标签: c# python .net c#-4.0 python-2.7

我正在编写一个运行python脚本的WCF服务。

因为我一直在使用以下代码:

ProcessStartInfo start = new ProccessStartInfo();
start.FileName = "my/full/path/to/python.exe";
start.Arguments = string.Format("{0} {1}", script, args);
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;

Process p = new Process();
p.StartInfo = start;
p.Start();
p.WaitForExit();
string stderr = Process.StandardError.ReadToEnd();
string stdout = Process.StandardOutput.ReadToEnd();

现在我注意到了(在经过大量测试之后),如果错误与“编译”错误有关,则Process对象获取标准错误/输出或捕获异常,就像我使用了未声明的变量一样或类似的东西,但是没有捕获或能够在C#范围内读取运行时异常和打印。

我试图运行整个“python.exe pythonCommand.py args”,因为它们是从C#代码发送的,或者只是发送命令行提示符中ProcessStartInfo.Arguments中的内容,它返回异常和打印在这两种情况下,但是当我通过C#Process对象运行它时,我没有抛出任何异常来捕获并且没有输出或错误。

我没有发现任何关于这一点让我觉得有点愚蠢(希望我是,这有一个简单的解决方案),如果有人偶然发现这个案子可以帮助我,我真的很感激。

谢谢, 马特

1 个答案:

答案 0 :(得分:0)

嗯,在这里回答你的评论:

  

但问题是异常没有被抛出   python也不是要读取的输出。该过程的标准输出   (以及标准误差)总是空的 - 马特之星

您正在捕获输出错误。这将允许您捕获输出,并应显示抛出的任何异常。

使用System; 使用System.Diagnostics;

namespace InteractWithConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
            cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
            cmdStartInfo.RedirectStandardOutput = true;
            cmdStartInfo.RedirectStandardError = true;
            cmdStartInfo.RedirectStandardInput = true;
            cmdStartInfo.UseShellExecute = false;
            cmdStartInfo.CreateNoWindow = true;

            Process cmdProcess = new Process();
            cmdProcess.StartInfo = cmdStartInfo;
            cmdProcess.ErrorDataReceived += cmd_Error;
            cmdProcess.OutputDataReceived += cmd_DataReceived;
            cmdProcess.EnableRaisingEvents = true;
            cmdProcess.Start();
            cmdProcess.BeginOutputReadLine();
            cmdProcess.BeginErrorReadLine();

            cmdProcess.StandardInput.WriteLine("ping www.bing.com");     //Execute ping bing.com
            cmdProcess.StandardInput.WriteLine("exit");                  //Execute exit.

            cmdProcess.WaitForExit();
        }

        static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Output from other process");
            Console.WriteLine(e.Data);
        }

        static void cmd_Error(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Error from other process");
            Console.WriteLine(e.Data);
        }
    }
}

我复制了这篇文章中的代码:How to parse command line output from c#? 我多次使用这种方法,它的工作完美。 希望这可以帮助。