我想寫一個捕獲標準輸出的Python程序的C#程序。我的問題是,所有的輸出都是在程序執行之後發生的,而不是實際發生的時間。作爲一個例子,這個Python程序:捕獲python程序的標準輸出,因爲它發生
print "Hello"
time.sleep(2)
print "Hello"
我希望得到「你好」,兩秒鐘的間隙,然後又是「你好」。實際結果是兩秒鐘的差距,然後是「你好」,「你好」。
如果我從命令行運行上面的python腳本,我會得到所需的行爲。如果命令提示符可以執行此操作,那麼我應該能夠模擬該功能,而不必重複刷新緩衝區。
我使用這個運行從C#的處理:
_proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "C:\\Python27\\python.exe",
Arguments = pyScript,
RedirectStandardError = true,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
_proc.OutputDataReceived += ProcOnOutputDataReceived;
_proc.Start();
_proc.BeginOutputReadLine();
我可以運行此C#代碼(和改變上述的ProcessStartInfo屬性運行C#可執行文件)並將其正確行爲:
Console.WriteLine("Hello");
Thread.Sleep(2000);
Console.WriteLine("Hello");
通過此代碼,我得到「你好」,兩秒鐘的差距,然後是另一個「你好」。
任何想法爲什麼?我怎樣才能讓python解釋器發送標準輸出?
聽起來像一個緩衝的問題。打印後嘗試刷新「sys.stdout」。 – geoffspear
在Windows中,正常行爲是標準輸出堆積直到子進程退出。但這可能有所幫助:http://stackoverflow.com/a/10940793/424129 - 這裏指出 - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx - 但那個答案值得信任的人! –
我應該做更多的研究。這個問題是在這裏回答http://stackoverflow.com/questions/2380649/redirect-python-standard-input-output-to-c-sharp-forms-application?rq=1 – johnB