我正在编写一个运行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对象运行它时,我没有抛出任何异常来捕获并且没有输出或错误。
我没有发现任何关于这一点让我觉得有点愚蠢(希望我是,这有一个简单的解决方案),如果有人偶然发现这个案子可以帮助我,我真的很感激。
谢谢, 马特
答案 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#? 我多次使用这种方法,它的工作完美。 希望这可以帮助。