使用PyQt5将qDebug输出重定向到文件

kof*_*ein 6 python qt pyqt5

我使用python2.7,Qt5.5和PyQt5实现了一个应用程序.我让Python-logger使用logging-Module 工作:Log-Messages既发送到stderr又发送到日志文件.

但是,Qt日志消息只出现在stderr中,我找不到将它们重定向到文件的方法.

为了缩小问题范围,我尝试了这个:

>>> from PyQt5.QtCore import qDebug
>>> import sys
>>> sys.stderr = open("stderr.txt", 'w')
>>> qDebug('test message')
test message
>>> sys.stderr.close()
>>> # stderr.txt is empty
Run Code Online (Sandbox Code Playgroud)

注意: pure-Qt-way似乎是在操作一个QDebug对象,但我无法在PyQt5中找到该类.

问题: 如何qDebug写入文件stderr.txt

ekh*_*oro 9

您可以安装消息处理程序:

import sys
from PyQt5 import QtCore, QtWidgets

def qt_message_handler(mode, context, message):
    if mode == QtCore.QtInfoMsg:
        mode = 'INFO'
    elif mode == QtCore.QtWarningMsg:
        mode = 'WARNING'
    elif mode == QtCore.QtCriticalMsg:
        mode = 'CRITICAL'
    elif mode == QtCore.QtFatalMsg:
        mode = 'FATAL'
    else:
        mode = 'DEBUG'
    print('qt_message_handler: line: %d, func: %s(), file: %s' % (
          context.line, context.function, context.file))
    print('  %s: %s\n' % (mode, message))

QtCore.qInstallMessageHandler(qt_message_handler)

app = QtWidgets.QApplication(sys.argv)

def main():
    QtCore.qDebug('something informative')
    win = QtWidgets.QMainWindow()
    # trigger a Qt debug message
    win.setLayout(QtWidgets.QVBoxLayout())

main()
Run Code Online (Sandbox Code Playgroud)

但请注意:

  • 对于python代码,上下文属性总是存在,但对于来自Qt的消息,您将需要一个调试版本(或者 QT_MESSAGELOGCONTEXT在发布版本中定义)
  • 由于某种原因,qInfo()目前还没有被PyQt包装