2012-07-23 89 views
3

我希望在我的C#控制檯應用程序中嵌入一個exe文件(特別是Python 2.7的解釋器中的「python.exe」),這意味着我希望用戶輸入命令,將解釋器的輸出接收到字符串變量並使用Console。 WriteLine打印輸出。到目前爲止我的代碼是:在C#控制檯中嵌入一個exe文件?

ProcessStartInfo processStartInfo = new ProcessStartInfo("C:/Python27/python.exe"); 
processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 
processStartInfo.UseShellExecute = false; 

Process process = Process.Start(processStartInfo); 

if (process != null) 
{ 
    while (true) 
    { 
     process.StandardInput.WriteLine(Console.ReadLine()); 
     process.StandardInput.Close(); 

     string output = process.StandardOutput.ReadToEnd(); 
     Console.WriteLine(output); 
    } 
} 

我可以寫「打印5」,並得到正確的輸出,但再次書寫時,我收到以下錯誤:

Cannot write to a closed TextWriter.

我認爲這個錯誤是因爲我關閉了StandardInput,但沒有這行代碼,我根本沒有得到任何輸出。我可以使用什麼發送多個命令到exe文件?

預先感謝您!

+1

你可以調用process.StandardInput.Flush()而不是Close()嗎? – scottm 2012-07-23 20:13:25

+2

你有沒有考慮過使用IronPython? – 2012-07-23 20:13:35

+1

調用這個「嵌入」非常非正統。 :) – bzlm 2012-07-23 20:42:15

回答

1

改爲撥打process.StandardInput.Flush()。 Flush使任何緩衝的TextWriter將其所有輸入寫入目標,這就是發生了什麼 - 您調用了Close(),它具有刷新緩衝區以及關閉流的副作用。

有關更多信息,請參閱the MSDN documentation

+0

嘿,謝謝你的回覆,我是發佈這個問題的人(在我朋友家裏)。替換'Close()'到'Flush()'不起作用,它甚至不運行我放的第一個命令... – 2012-07-23 20:40:11

+0

在StreamReader.ReadToEnd()上發現此評論 - 「ReadToEnd假定流知道當它結束時對於交互式協議,服務器只在你詢問並且沒有關閉連接時發送數據,ReadToEnd可能會無限期地阻塞,因爲它沒有達到目的,應該避免。「看來在StreamReader上使用.EndOfStream屬性也會導致無限塊。那麼問題是,你爲什麼要這樣做?您可能需要重新考慮您的方法。 Mark Byers對Iron Python有一個很好的建議。 – Kilanash 2012-07-23 21:59:52

+0

正如我在這個問題的評論中提到的,我嘗試過使用IronPython。問題是我正在使用幾個庫作爲.PYD文件,因此只能與CPython一起使用。 – 2012-07-26 16:51:46