0

我正在编写一个运行 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 对象运行它时,我没有收到任何异常抛出来捕捉,也没有任何输出或错误。

我对此一无所知,这让我感到有点愚蠢(希望我是,并且这有一个简单的解决方案),如果偶然发现此案的人能帮助我,我将不胜感激。

谢谢,马特

4

1 回答 1

0

好吧,在这里回答您的评论:

但问题是python没有抛出异常,也没有要读取的输出。过程的标准输出(以及标准错误)总是空的——Matt Star

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

使用系统;使用 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#? 我已经多次使用这种方法并且效果很好。希望这可以帮助。

于 2013-07-17T20:22:31.260 回答