如何在不需要断点的情况下 运行 Anki-Qt 脚本?
How to run Anki-Qt script without requiring a breakpoint?
如果我运行玩具脚本如下图:
import sys
sys.path.append('/usr/share/anki')
import aqt
app = aqt._run(argv=['/usr/bin/anki', '--profile=test'], exec=False)
# breakpoint()
print(repr(aqt.mw.col))
aqt.mw.cleanupAndExit()
...我得到以下输出,这是不正确的:
$ python3 /tmp/ankiq.py
None
但是,如果我取消对注释语句的注释,然后重新运行修改后的脚本,我会得到正确的输出(最终):
$ python3 /tmp/ankiq.py
> /tmp/ankiq.py(8)<module>()
-> print(repr(aqt.mw.col))
(Pdb) c
<anki.collection._Collection object at 0x7f32ec1417b8>
我想避免使用 breakpoint()
语句(以及每当我想要 运行 这样的代码时都必须点击 c
)。
我的猜测是,当 breakpoint()
语句被注释掉时,print
语句发生在 aqt.mw
完全初始化之前。
(我尝试用 time.sleep(1)
替换 breakpoint()
语句,但是当我 运行 脚本进行此修改时,它在打印任何输出之前挂起。)
问: 我如何修改上面的玩具脚本,以便在 print
语句执行时,aqt.mw.col
具有正确的值?
似乎调用 aqt._run(*args, exec=False)
returns 一个 QApplication
对象 - 但没有启动它的事件循环。因此,要手动处理未决事件,您可以尝试调用 app.processEvents()
.
从评论来看,确切的解决方案如下:
while aqt.mw.col is None:
app.processEvents()
如果我运行玩具脚本如下图:
import sys
sys.path.append('/usr/share/anki')
import aqt
app = aqt._run(argv=['/usr/bin/anki', '--profile=test'], exec=False)
# breakpoint()
print(repr(aqt.mw.col))
aqt.mw.cleanupAndExit()
...我得到以下输出,这是不正确的:
$ python3 /tmp/ankiq.py
None
但是,如果我取消对注释语句的注释,然后重新运行修改后的脚本,我会得到正确的输出(最终):
$ python3 /tmp/ankiq.py
> /tmp/ankiq.py(8)<module>()
-> print(repr(aqt.mw.col))
(Pdb) c
<anki.collection._Collection object at 0x7f32ec1417b8>
我想避免使用 breakpoint()
语句(以及每当我想要 运行 这样的代码时都必须点击 c
)。
我的猜测是,当 breakpoint()
语句被注释掉时,print
语句发生在 aqt.mw
完全初始化之前。
(我尝试用 time.sleep(1)
替换 breakpoint()
语句,但是当我 运行 脚本进行此修改时,它在打印任何输出之前挂起。)
问: 我如何修改上面的玩具脚本,以便在 print
语句执行时,aqt.mw.col
具有正确的值?
似乎调用 aqt._run(*args, exec=False)
returns 一个 QApplication
对象 - 但没有启动它的事件循环。因此,要手动处理未决事件,您可以尝试调用 app.processEvents()
.
从评论来看,确切的解决方案如下:
while aqt.mw.col is None:
app.processEvents()