如何无需断点运行Anki-Qt脚本并正确获取aqt.mw.col值
问题原因
aqt._run 传入 exec=False 时,仅完成Anki主窗口的基础实例化,不会自动启动Qt事件循环,集合加载、主窗口初始化这类异步任务都会留在事件队列中等待执行。直接调用print时这些任务还未执行,所以aqt.mw.col返回None。breakpoint能生效是因为pdb中断时,底层会处理待执行的Qt事件,刚好完成了集合初始化;而time.sleep会阻塞主线程,事件队列完全不会被处理,所以永远等不到初始化完成,还会导致程序卡住。
修改后的代码
import sys import time sys.path.append('/usr/share/anki') import aqt from PyQt5.QtCore import QCoreApplication app = aqt._run(argv=['/usr/bin/anki', '--profile=test'], exec=False) # 循环处理事件直到集合初始化完成 while aqt.mw.col is None: QCoreApplication.processEvents() # 添加短延时避免空转占用过高CPU time.sleep(0.01) print(repr(aqt.mw.col)) aqt.mw.cleanupAndExit()
代码说明
- 调用
QCoreApplication.processEvents()会主动处理当前队列里所有待执行的Qt事件,驱动Anki的初始化流程推进 - 0.01秒的短延时不会影响初始化速度,同时可以避免循环空转占用过多CPU资源
- 循环判断
aqt.mw.col is None保证只有集合初始化完成后,才会执行后续的打印逻辑
内容的提问来源于stack exchange,提问作者kjo
相关产品推荐
相关产品推荐

