2016-03-09 43 views
4

我使用python2.7,Qt5.5和PyQt5實現了一個應用程序。我得到了使用logging的Python記錄器 - 模塊:日誌消息都發送到stderr和日誌文件。使用PyQt5將qDebug輸出重定向到文件

但是,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 

注: 的純Qt的方式似乎是操縱QDebug對象,但我沒能找到類在PyQt5中。

問題: 怎樣纔可以有qDebug寫入到文件stderr.txt

回答

4

您可以安裝一個message handler

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() 

但請注意:

  • 上下文屬性會永遠在那裏爲Python代碼,但 消息從Qt的未來,你將需要一個調試版本(或在發佈版本中定義了 QT_MESSAGELOGCONTEXT
  • 由於某種原因,當前未包含在PyQt中