我正試圖在派生的子進程中運行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()
你有什麼打算,你使用的PySide和Qt的版本是什麼?我在Linux(PySide 1.2.1,Qt 4.8.5)和WinXP(PySide 1.1.1,Qt 4.7.4)上運行了第二個測試,並且它工作正常(即它退出代碼0)。 – ekhumoro
有趣。我在Mac OS X 10.9.1上使用Python 2.7.3 64位和PySide 1.1.1。第一次測試還有效,還是第二次? –
但是PySide **和** Qt **的哪些版本?你在使用Linux,Windows,OSX嗎?據推測,這個例子對我來說肯定有一些與系統有關的理由,但不適合你。你可以嘗試使用PyQt的例子嗎? – ekhumoro