0. Python里的退出还真不少。尽管他们都可以退出程序,那他们到底有啥区别咧?
1. 有哪些可以退出。
python自带的有四个退出。(或许还有,报错不算。)PyQt每个窗口都有一个close方法用于退出。
2. 这些玩意的区别。
help命令查看帮助。
sys.exitexit(...)
exit([status])
Exit the interpreter by raising SystemExit(status).
If the status is omitted or None, it defaults to zero (i.e., success).
If the status is an integer, it will be used as the system exit status.
If it is another kind of object, it will be printed and the system
exit status will be one (i.e., failure).
os._exit_exit(...)
_exit(status)
Exit to the system with specified status, without normal exit processing.
quitclass Quitter(builtins.object)
| Methods defined here:
|
| __call__(self, code=None)
|
| __init__(self, name, eof)
|
| __repr__(self)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
exitclass Quitter(builtins.object)
| Methods defined here:
|
| __call__(self, code=None)
|
| __init__(self, name, eof)
|
| __repr__(self)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
查看帮助可以发现,quit和exit没啥区别,连帮助都一个样。
那先区分一下sys.exit和exit/quit
通过帮助信息可以看出,sys.exit有个主要的功能就是抛出错误SystemExit还有自定义错误码,正常退出是0(执行完整个过程。)。那exit/quit是否有呢。
try:
sys.exit()
except SystemExit:
print(1)
try:
exit()
except SystemExit:
print(2)
结果:
发现也有这个错误。
基本来看sys.exit与exit/quit并没啥区别。可能exit/quit在shell中使用起来比较方便。sys.exit显得比较高端- -。
那os._exit和sys.exit的区别。帮助上说os._exit直接退出,不走正常的处理。也就是说直接干掉这个进程,没有异常,一些缓存啥的也不清理。
区别1: sys.exit可抛出异常,可以捕获这个异常进行一些处理。(根据非正常退出时的状态码。)
os._exit直接杀进程,简单粗暴。
那在线程中有什么影响木有呢。
import time
import sys
import os
import threading
class T(threading.Thread):
def __init__(self, arg):
super(T, self).__init__()
self.arg = arg
def run(self):
time.sleep(self.arg)
print(1+self.arg)
os._exit(0)
a = T(1)
b = T(2)
a.start()
b.start()
打印2之后,程序结束。(废话,进程都没了。)
换成sys.exit()
打印2之后又打印了3。
又测试了一下exit/quit。
区别2: sys.exit可以退出某一线程,而不退出整个程序。
os._exit直接退出整个程序。
说了这么一大坨和pyqt有什么关系?
import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Main(QWidget):
def __init__(self, parnet=None):
super(Main, self).__init__(parnet)
self.setWindowTitle('Hello Qt')
self.setWindowIcon(QIcon('../pic/f.jpg'))
self.resize(300, 200)
self.btn_close = QPushButton(self)
self.btn_close.setText('关闭')
self.btn_close.setIcon(QIcon('../pic/f.jpg'))
self.btn_close.clicked.connect(sys.exit)
def closeEvent(self, event):
print(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Main()
main.show()
sys.exit(app.exec_())
我们创建了一个关闭按钮,连接到sys.exit。
重写的关闭事件,关闭窗口前做的事。我们让他打印出1。
并没有触发关闭事件。
换成os._exit试试。self.btn_close.clicked.connect(os._exit)
依然没有触发关闭事件。
难道exit/quit和他们微妙的区别会体现在这里?
我们试一下。self.btn_close.clicked.connect(exit)
self.btn_close.clicked.connect(quit)
依然木有触发关闭事件。
Q: what!什么情况,你确定关闭会调用closeEvent?
A: 不信点窗口右上角~。
Q: 还真有,那怎么写才能让他触发关闭事件?
A: 每个窗口都有一个close函数,用于关闭窗口,这个函数会触发关闭事件。右上角那个叉也是调用的这个函数。可以打印event看一看。 self.btn_close.clicked.connect(self.close)
def closeEvent(self, event):
print(event)
<PyQt5.QtGui.QCloseEvent object at 0x01896800>
***Repl Closed***
网上教程大部分都用的sys.exit作为退出连接,想触发关闭事件还是用close关闭吧,这个p问题也是折腾好久。。
简单总结:
exit/quit 使用方便,一般用于shell里交互。
sys.exit 可用于退出单个线程。
os._exit 大杀器,直接使用可能会造成一定量的垃圾。
另外:
在pyqt中想要触发关闭事件需要用
self.close
以上三个均不会触发关闭事件。