2014-02-14 72 views
1

我有一個python腳本,每10秒左右輸出一次到控制檯。 我想從我的C++代碼運行該腳本,並保持它運行,以繼續獲取更新,直到我關閉我的應用程序。如果我使用popen,我可以逐行獲取輸出,而無需等待腳本「完成」,但是現在關閉我的應用程序後,我無法殺死它。從C++中讀取python腳本輸出Qt app

有沒有一種方法可以在腳本輸出時讀取腳本輸出,讓腳本繼續運行直到關閉我的qt應用程序?

謝謝!

+1

你看過[QProcess](http://qt-project.org/doc/qt-5.0/qtcore/qprocess.html)嗎?該文檔說明了如何從代碼關閉進程,並且它具有標準的讀/寫通道來與其進行通信。 – MatthiasB

+1

@MatthiasBonora謝謝!我看過那個類,但是當我嘗試它時,我有一個完全分離的問題,python並沒有刷新stdout緩衝區。一旦我解決了這個問題,QProcess就像一個魅力,真棒!如果你願意,可以說這是一個答案,所以我可以給你信用。 –

+0

完成。我希望這可以讓大家更容易看到。 – MatthiasB

回答

0

QProcess允許您從代碼中調用外部進程。該文檔包含有關如何在程序中關閉它的信息。您也可以使用讀/寫通道進行通信。

在文檔和方法描述中有一些示例,用於入門。

+0

這是解決方案,我剛剛通過它,因爲我有兩個單獨的問題。首先,我的python和C腳本沒有刷新stdout緩衝區,所以一旦我在python中添加了sys.stdout.flush(),並且在C中添加了setbuf(stdout,NULL),我的腳本就正確地寫入了stdout。一旦這是工作,使用QProcess的readyReadStandardOutput信號和readAllStandardOutput方法,我可以正確地看到我所有的輸出!謝謝@MatthiasBonora –

+0

@ phil.harlow Python中的控制檯緩衝區保證在應用程序退出時進行刷新 - 所以如果腳本運行完成並且沒有中止早期/崩潰,應該刷新它的緩衝區。同樣適用於C運行時 - 任何half-decent的實現都會在'main'返回時刷新stdout/stderr緩衝區。我認爲你的問題不是你想象的那樣。 –

+0

@KubaOber你是對的,在關閉我的應用程序時,我會一次看到我所有的python腳本的輸出。問題是我想看到這些消息,因爲它們是由python逐行推出的,所以在python中的printf語句後添加sys.stdout.flush()現在推送緩衝區並讓它在C++中顯示。這是一個讓我認爲QProcess readyReadStandardOutput信號不能正常工作的問題,因爲它只在最後觸發一次。一旦我修復了python buffer flush,我就能夠計算出QProcess信號,一切都很好! –