【问题标题】:How to run Anki-Qt script without requiring a breakpoint?如何在不需要断点的情况下运行 Anki-Qt 脚本?
【发布时间】:2021-11-08 07:22:22
【问题描述】:

如果我运行如下所示的玩具脚本:

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 具有正确的值?

【问题讨论】:

  • 你不应该在anki中使用from的anki插件吗?
  • @musicamante:我没有在开发/使用 anki 插件。我想开发一个 cron(即无监督/自动运行/非交互式)脚本来访问并可能修改我的 collection.anki2 数据库。
  • @eyllanesc:很抱歉回滚您的编辑。这个问题所涉及的 Python 包主要包含一个 PyQt 应用程序,我认为我遇到的问题与这个事实有关。
  • @kjo 尝试在其他语句之前调用app.processEvents()
  • @ekhumoro:非常感谢!当我在print 语句之前添加app.processEvents() 时,我仍然得到输出None,但添加while aqt.mw.col is None: app.processEvents() 就成功了!如果您愿意发布它,我很乐意接受这个作为答案。

标签: python pyqt event-handling anki


【解决方案1】:

似乎调用aqt._run(*args, exec=False) 会返回一个QApplication 对象——但没有启动它的事件循环。要手动处理未决事件,您可以尝试调用app.processEvents()


从 cmets 看来,确切的解决方案如下:

while aqt.mw.col is None: 
    app.processEvents()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多