sip.setdestroyonexit(False) solved my problem. This would be an ultimate answer for crash-on-exit of pyqt. The pyqt document said:
When the Python interpreter exits PyQt4 (by default) calls the C++ destructor of all wrapped instances that it owns. This happens in a random order and can therefore cause the interpreter to crash. This behavior can be disabled by calling the sip.setdestroyonexit() function.
PyQt5 always calls sip.setdestroyonexit() automatically.
Another reference should be this post, the author of pyqt talked about sip.setdestroyonexit().