我使用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?
您可以安装消息处理程序:
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)
但请注意:
QT_MESSAGELOGCONTEXT在发布版本中定义)qInfo()目前还没有被PyQt包装