qt 记录-日志记录方式
这是我的一个项目中的 main.py
,主要有以下几点:
1. 解析 BASE_DIR
中判断是正常脚本,还是 Pyinstaller 编译的程序,这样可以把日志放在正确的位置
2. 设置 sys.exception
为一个自定义的函数,这样异常退出时可以统一进入这个函数,里面使用 traceback
进行详细输出
3. 上面的自定义异常处理函数,最后显示 QMessageBox
,这样比较用户友好一些
4. 进行了输出重定向,这一点不算很推荐。主要因为里面的各个类用了许多 print
,所以我懒得每次都要写入文件,所以就用了重定向
5. 如果不用输出重定向,异常处理中使用 traceback
的地方可能要稍微修改一些,写入对应的文件,具体自行查阅资料
import os
os.chdir(os.path.dirname(__file__))
import sys
from PyQt5.QtWidgets import QApplication, QMessageBox
from PyQt5.QtCore import Qt, QTimer
import time
import traceback
# 正常运行 .py 文件时
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
if getattr(sys, 'frozen', False):
# 被 PyInstaller 等工具打包后的执行路径
BASE_DIR = os.path.dirname(sys.executable)
# 定义日志文件路径
log_file = os.path.join(BASE_DIR, 'LOG.txt')
def show_error_dialog_in_main_thread():
msg_box = QMessageBox()
msg_box.setWindowFlags(msg_box.windowFlags() | Qt.WindowStaysOnTopHint)
msg_box.setIcon(QMessageBox.Critical)
msg_box.setWindowTitle("未处理的错误")
msg_box.setText(f'发生错误,请检查 {os.path.dirname(__file__)} 中的 LOG.txt 文件')
msg_box.exec_()
# 错误框关闭后退出
sys.exit(1)
def global_exception_handler(exctype, value, tb):
# 写入日志
# 打印时间
print(f'{time.strftime("%Y-%m-%d %H:%M:%S")}\n')
# 打印错误信息
traceback.print_exception(exctype, value, tb, file=sys.stdout)
show_error_dialog_in_main_thread()
# 在程序启动时设置
sys.excepthook = global_exception_handler
# 重定向标准输出
sys.stdout = open(log_file, 'w', encoding='utf-8')
app = QApplication(sys.argv)
from captureWin import CaptureWin
mainwin = CaptureWin(BASE_DIR)
mainwin.show()
sys.exit(app.exec_())