是这样的,我用 pyqt5 写了一个 gui 程序,在主线程中用 multiprocessing 启动新的进程执行一些任务。现在我想把这个子进程的 log 输出到 ui 上,采用了添加 logging.Handler 的方式获取子进程的 log ,然后写入到 ui 中。但是问题来了,由于 qt 的进程安全机制,明明已经获取到 log 了,但是它就是不让我输出到 ui 中,通过 print 的方式是可以显示的。
所以想问下各位大神,我需要怎么做才能让它把 log 写到 ui 中?
代码大概是这样的:
class MyLogHandler(logging.Handler):
def __init__(self, obj):
logging.Handler.__init__(self)
self.Object = obj
def emit(self, record):
if record.levelno<self.level: return
tstr = time.strftime('%Y-%m-%d %H:%M:%S.%U')
self.Object.append("[%s][%s] %s"%(tstr, record.levelname, record.getMessage()))
self.Object.moveCursor(QtGui.QTextCursor.End)
mySW = MainWindow()
handler = MyLogHandler(mySW.loggingBrowser)
logging.getLogger().addHandler(handler)
multiprocessing.Process(pass).start()
其中的 loggingBrowser
就是 log 显示组件。由于 logging 是模块级别的,因此主线程中的MyLogHandler
可以捕获到子进程的 log 输出。
补充:
当然,如果用多线程的话是可以的,但是不管是python的多线程还是qt的多线程,都存在无法强制结束子线程的问题。所以只能用多进程了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.