PyQtやPyQtGraphなどでGUIのプログラムで試行錯誤をする際にも、
jupyterなどは便利でよく使っているのですが、
1つ最高に面倒な点があります。
PyQt系のGUIのプログラムを何度か動かしていると、
必ずkernel が死ぬのです。
そのことでやっと対処法を見つけました。
終了時のsys.exit() の有無は関係なかった。
これ→ sys.exit(app.exec_())
sys.exitが変に終了してるのが原因かと思ってましたが、こいつは無実でした。
終了時のsys.exit() の有無は(少なくともjupyterでは)関係なかった。(Spyderは未確認)
appを直前に別のもので上書きするだけ!(PyQt4のみ。PySideでは使えません)
app = 0 #この行を追加
app = QtGui.QApplication(sys.argv)
これだけで、何度も同じコードをjupyterで動かしても、
鬱陶しいkernel restart がなくなった!やったー!
参考
https://www.reddit.com/r/learnpython/comments/45h05k/solved_kernel_crashing_when_closing_gui_spyder/
2016/09/01追記
コメントのmojaieさんのやり方でもいけました。
どう考えてもこちらの方法のが真っ当ですね。
app = QtGui.QApplication.instance()
if app is None:
app = QtGui.QApplication(())
また、PyQt4は無言で実行してkernelが死ぬのに対し、
PySideだとQApplicationの多重のインスタンス作成を事前に阻止してランタイムエラーを返してくれることに衝撃を受けました。
PyQt4とPySideの育ちの違いですね。。。
また、PySideではランタイムエラーが起きるため、app=0は使えません。
app=0 は、PyQt4用のおまじないということで・・・