2013-12-22 33 views
2

我正試圖在派生的子進程中運行PySide GUI,但它始終以exitcode 11(segfault)退出。這種簡化的測試代碼工作正常,如果run_gui被直接調用,但如果它運行一個子進程中失敗:爲什麼我無法在產生的子進程中運行PySide GUI?

# std lib imports 
import time 
import sys 
from multiprocessing import Process 

# third party imports 
from PySide.QtGui import QApplication, QMainWindow 


def run_gui(): 
    app = QApplication([]) 
    w = QMainWindow() 
    w.show() 
    w.raise_() 
    sys.exit(app.exec_()) 


def main(): 
    gui_proc = Process(target=run_gui) 
    #gui_proc.daemon = True # this doesn't seem to matter 
    gui_proc.start() 
    while True: 
     if not gui_proc.is_alive(): 
      if gui_proc.exitcode != 0: 
       print 'GUI exited with code {}'.format(gui_proc.exitcode) 
      else: 
       print 'GUI exited cleanly.' 
      break 
     time.sleep(1) 

if __name__ == "__main__": 
    ## GUI in main process: 
    #run_gui() 
    ## GUI in child process: 
    main() 

有沒有辦法解決?我不確定如何調試導致段錯誤的原因。

我對這樣做感興趣的原因是,如果它意外崩潰,一直保持一對守護進程運行(一個用於磁盤訪問,另一個用於與儀器交互),我可以重新啓動GUI。

編輯:我只是嘗試了另一個測試腳本(下面)使用QCoreApplication和沒有GUI,我看到了同樣的問題。 PySide顯然不會在兒童流程中運行。

# std lib imports 
import time 
import sys 
from multiprocessing import Process 

# third party imports 
from PySide.QtCore import QCoreApplication, QTimer 

def quit(): 
    print "Quiting..." 
    sys.exit() 

def run(): 
    app = QCoreApplication([]) 
    timer = QTimer() 
    timer.timeout.connect(quit) 
    timer.start(1000) 
    print "Starting..." 
    sys.exit(app.exec_()) 

def main(): 
    proc = Process(target=run) 
    #proc.daemon = True # this doesn't seem to matter 
    proc.start() 
    while True: 
     if not proc.is_alive(): 
      print 'Process exited with code {}'.format(proc.exitcode) 
      break 
     time.sleep(1) 

if __name__ == "__main__": 
    ## GUI in main process: 
    #run() 
    ## GUI in child process: 
    main() 
+0

你有什麼打算,你使用的PySide和Qt的版本是什麼?我在Linux(PySide 1.2.1,Qt 4.8.5)和WinXP(PySide 1.1.1,Qt 4.7.4)上運行了第二個測試,並且它工作正常(即它退出代碼0)。 – ekhumoro

+0

有趣。我在Mac OS X 10.9.1上使用Python 2.7.3 64位和PySide 1.1.1。第一次測試還有效,還是第二次? –

+0

但是PySide **和** Qt **的哪些版本?你在使用Linux,Windows,OSX嗎?據推測,這個例子對我來說肯定有一些與系統有關的理由,但不適合你。你可以嘗試使用PyQt的例子嗎? – ekhumoro

回答

0

我有過類似的問題,

我選擇了重新安排我的代碼,使數據收集和分析過程中它自己運行。

這是,我有一個非常簡單的桂線程和繪圖線程。如果由於某種原因,貴止步不前,我仍然可以品嚐我的數據「及時」

我不喜歡的短語

,這樣我可以重新啓動GUI如果意外崩潰

基本上,如果你的GUI崩潰,你應該修復這個問題,而不是做一個解決方法。

+0

我已經有了一個在子進程中工作的數據收集,但我想把GUI也放在子進程中。由於全局解釋器鎖定,線程是不夠的。我很樂意編寫一個無bug的GUI,但我正在做最壞的準備,並通過將數據收集與演示分離來設計應用程序以容忍錯誤。我可以完全分離兩個進程而不是使用子進程,但是我需要重新實現multiprocessing.Pipe提供的功能,這是非常重要的。 –

相關問題