2012-02-06 62 views
1

我對此問題感到絕對困惑。讓我快速運行我正在編寫的程序:控制檯應用程序運行錯誤代碼

我正在構建一個無限期的python腳本,運行腳本,解析StdOut/Err,並將這些結果寫入數據庫。

我一直在從底層開始構建它,現在我需要將所有的部分拼湊在一起。不過,我一直在調試問題。我通常不製作控制檯應用程序,但爲了我所做的目的,沒有其他選擇(即我的目標是創建一個以python腳本作爲參數的控制檯應用程序)。

因此,在我的命名空間中,爲了清楚起見,我有兩個主要的類,爲了清晰起見,我將它們分成了兩個不同的文件。所有內部的功能都是靜態的,所以它實際上只是一個組織性的東西。這兩個文件分別是我編寫的python運行輸出捕獲應用程序和我編寫的數據庫報告應用程序的「Harness」和「Query」。現在我試圖讓Harness的結果進入查詢。爲了讓代碼更容易維護,我試圖將它們保存在單獨的文件中,以便更容易消化。

問題是,當我啓動我的命令行並瀏覽可執行文件並將其作爲參數傳遞給示例python腳本時,我只從應用程序的查詢一半獲得控制檯輸出。我已經在Harness文件的main(string [] args)函數中放置了一些Console.WriteLines,但這些函數永遠不會寫入。只有第二個Query類中的代碼纔會被執行 - 有點。

這裏是東西真的開始混淆我的地方,我的線束中的一個功能是應用程序的一半寫入日誌文本文件,該文件的時間標記運行並報告結果。該文本文件仍在寫入。然後我想我的示例py文件輸出到一個文本文件,因爲我的重定向標準輸出顯然不工作。果然,python打開了該文本文件並寫信給它,暗示它確實運行了該代碼。

然而,這些日誌記錄調用的函數包含不輸出到控制檯的Console.WriteLines。唯一的時間控制檯輸出工作,是在應用程序的後半部分。

如果有人能夠解釋這些問題,我真的會挖掘它。我有很多代碼都包含一些敏感數據,所以我寧願不只是給它一個大的轉儲,實際上沒有我認爲與該問題有關的代碼的特定區域 - 我承認我不知道當然。讓我知道你對我的需求,我會盡我所能。

 List<string> retList = new List<string>(); 
     // Loads Python 
     Process pr = new Process(); 

     pr.StartInfo.FileName = @"C:\Python27\python.exe"; 
     pr.StartInfo.Arguments = script; 
     Console.WriteLine(script); 
     //pr.StartInfo.Arguments = @"C:\PythonProj\hello.py"; 
     pr.StartInfo.UseShellExecute = false; 
     pr.StartInfo.RedirectStandardOutput = true; 
     pr.StartInfo.RedirectStandardError = true; 

     // Runs Test Script 
     pr.Start(); 
     string output = pr.StandardError.ReadToEnd(); 
     pr.WaitForExit(); 
     Console.WriteLine(output); 
+1

請顯示一些相關的代碼。 – 2012-02-06 17:41:14

+0

同意奧斯汀。具體來說,顯示您創建/調用新流程的代碼。這些屬性可能沒有正確設置來處理輸入/輸出流的重定向。 – Servy 2012-02-06 17:43:13

+0

我將代碼編輯到主帖子中。 而且,值得一提的是,運行代碼的線束本身就可以工作(編輯)。雖然看到重定向代碼時確實遇到問題,但「harness」類中的控制檯寫入語句沒有輸出到控制檯 – Wuzseen 2012-02-06 17:48:28

回答

1

好吧,第一個問題,正如我所預料的那樣,是您在這裏可能存在死鎖情況。我沒有看到你從標準輸出中讀取的內容,既然你重定向了輸出和錯誤,你需要小心你如何從它們讀取,以避免死鎖。 Process中重定向屬性的MSDN頁面討論了這個問題,並提供了足夠滿足您需要的代碼示例。

如果問題是您沒有在控制檯中看到進程的輸出,那麼目前爲止我沒有看到它應該寫在哪裏(或者從Process讀取)。你是否爲了簡潔而忽略它?如果是這樣,請包括它。

+0

我將該流重定向到字符串var:output。從底部開始第三行,然後我寫它來控制兩行以用於調試目的。再次,這段代碼自行運行腳本絕對好。只有當我在下半場補充時,我是否會遇到這個問題。 – Wuzseen 2012-02-06 18:03:28

+0

您正在讀/寫標準的ERROR,但不是標準的OUTPUT。死鎖並不是一件確定的事情,它取決於寫入數據流的數據量以及是否能夠填充緩衝區。再次,請閱讀MSDN以獲取有關這些死鎖的詳細信息。 – Servy 2012-02-06 18:19:15

+0

對,嗯,我不完全確定我在找什麼,因爲我在沒有「查詢」代碼的替代項目中反覆運行此代碼。它正在工作,一遍又一遍。如果你能讓我確切地知道我在找什麼,因爲我多次看過這個文檔。 – Wuzseen 2012-02-06 18:21:55

相關問題