2014-04-22 43 views
1

我想寫一個捕獲標準輸出的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解釋器發送標準輸出?

+0

聽起來像一個緩衝的問題。打印後嘗試刷新「sys.stdout」。 – geoffspear

+1

在Windows中,正常行爲是標準輸出堆積直到子進程退出。但這可能有所幫助:http://stackoverflow.com/a/10940793/424129 - 這裏指出 - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx - 但那個答案值得信任的人! –

+0

我應該做更多的研究。這個問題是在這裏回答http://stackoverflow.com/questions/2380649/redirect-python-standard-input-output-to-c-sharp-forms-application?rq=1 – johnB

回答

1

您需要刷新輸出緩衝區。

import sys 
sys.stdout.flush() 

看到這個問題:How to flush output of Python print?

+0

謝謝,但我需要能夠在打印後不更新每個腳本以刷新的情況下執行此操作。命令提示符可以做到這一點,所以我認爲這是可能的 – johnB

相關問題