2013-07-17 35 views
0

我在寫一個運行python腳本的WCF服務。從c#中的python腳本捕捉運行時異常和輸出#

爲此,我一直在使用下面的代碼:

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

只是讓你的Python例外打印錯誤。然後抓住你的過程的輸出。你甚至可以寫一些東西來解析輸出並尋找錯誤。很難用你的python給你一個例子。 – Botonomous

+0

但問題是既沒有從python拋出異常,也沒有輸出被讀取。 過程的標準輸出(以及標準錯誤)始終爲空 –

+0

您正在讀取的輸出錯誤。 – Botonomous

回答

0

好,回答您的評論在這裏:

但問題是既沒有從該 蟒蛇,也不輸出拋出的異常被讀取。標準輸出 (以及標準錯誤)始終爲空 - Matt Star

您正在捕獲輸出錯誤。這將允許您捕獲輸出並應顯示拋出的任何異常。

using System; using 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#? 和它的作品完美。 希望這有助於。

+0

嗨匿名謝謝你的回答。 但它有兩個問題: 首先,我在原始問題中讀取輸出的方式對您的示例有效,它也是讀取輸出的常用方法,它也寫入您提供的鏈接中。 其次,當您運行python時,您的閱讀輸出方式和我的方式不起作用,即使我像您一樣在命令行過程中運行它。 我的一個測試是在代碼中添加另一個輸入行,它調用一個python腳本,它在我的python腳本上沒有返回任何內容,但是在ping上返回。 很奇怪 –