以编程方式在 Google Colab 中运行所有单元格命令

Posted

技术标签:

【中文标题】以编程方式在 Google Colab 中运行所有单元格命令【英文标题】:"Run all cells" command in Google Colab programmatically 【发布时间】:2021-05-05 03:23:26 【问题描述】:

我需要以编程方式从 Google Colab 菜单“运行时”运行某些命令“全部运行”。它没有任何明显的“onclick”事件处理程序,我可以从该页面上的 javascript 代码中调用它。 页面上的其他“div”可以从js调用,例如,我可以使用js代码连接到运行时:

document.querySelector('#top-toolbar > colab-connect-button').shadowRoot.querySelector('#connect').click();

运行时菜单是一个下拉菜单,我尝试.click() 其中的每个<div> 项目,但没有效果。

“全部运行”命令也有一个热键Ctrl + F9,但向document 元素分派事件无效。但是我可以使用以下代码将Enter 命令发送到笔记本内的任何输入字段:

document.querySelector('input.raw_input').dispatchEvent(new KeyboardEvent('keydown', key: 'Enter'))

使用 Chrome 代码检查器 Ctrl + Shift + I 我查看了“全部运行”命令,它看起来像:

<div command="runall" class="goog-menuitem" role="menuitem" id=":1w" style="user-select: none;"><div class="goog-menuitem-content" style="user-select: none;">Run all<span class="goog-menuitem-accel">Ctrl+F9</span></div></div>

所以我在页面上检查器代码的 Sources 选项卡中进行了搜索,发现 https://colab.research.google.com/v2/external/external_polymer_binary.js 文件中出现了“runall”:

, Eja = X(new W(
        id: "runall",
        description: "Run all cells in notebook",
        shortcut: IG(120)

120 - 顺便说一句,是F9 按钮的键码。我还发现我认为需要的菜单项被调用的确切位置:

        case "runall":
            d.runAll();
            break;

但我几乎不可能理解d. 是什么以及它的参考来源!

我还发现了许多其他有趣且有用的命令,例如this.notebook.getKernel().isRunning()c.notebook.getKernel().restart(),但问题始终相同:这些命令的根对象是什么?我尝试了document.window.,但结果是“未定义”或“不是函数”。我认为我可以在如下字符串中调用 runall() 命令:

document.**SOMETHING I DONT KNOW**.runAll()

我对前端/js 很不好,而且很难在混淆代码中找到一些东西,但是如果我们在连接到所需菜单项的 javascript 代码中具有 .runAll() 这样的功能,我就可以以编程方式运行它从控制台或 javascript 注入

或者也许可以将键盘事件Ctrl + F9 分派给某个元素以运行此命令,因此问题是分派键盘事件所需的对象是什么

【问题讨论】:

【参考方案1】:

出于类似的原因,我花了一段时间梳理那个 javascript 文件,最后弄清楚了如何使它工作。

这是一个以编程方式运行所有单元格的函数:

function runAll() 
  const F9Event = key: "F9", code: "F9", metaKey: true, keyCode: 120;
  document.dispatchEvent(new KeyboardEvent("keydown", F9Event));

请注意 KeyboardEvent.keyCode is deprecated 支持 KeyboardEvent.code,但您仍需要在此处提供它(截至 21 年 5 月 18 日),因为它是 Colab 用于检查键盘输入的属性。

您还可以互换使用 metaKey: truectrlKey: true,而不管平台如何,因为 Colab 只会检查是否存在 KeyboardEvent.metaKeyKeyboardEvent.ctrlKey 以获取需要它们的快捷方式。

我还发现了许多其他有趣且有用的命令,例如 this.notebook.getKernel().isRunning()c.notebook.getKernel().restart(),但问题始终相同:这些命令的根对象是什么?

有一个全局colab 对象提供对某些(但不是全部)功能的访问。大多数东西都可以通过colab.global 访问,例如要重新启动内核,您可以使用:

colab.global.notebook.kernel.restart()

【讨论】:

我也在 Chrome 的检查器模式下尝试了 colab.notebook.restart() 等,但没有效果。但我没有尝试 colab.global ...谢谢!我来到了 document.dispatchEvent(new KeyboardEvent('keydown', ctrlKey:true, bubbles:true, keyCode:120));也)) 很高兴知道把这段代码放在哪里。 @ctrl-alt-delor 你把它放在哪里取决于你的应用程序,但它必须从笔记本前端(在浏览器中)而不是内核(在 Colab VM 上)执行。与 Jupyter 不同,Colab 出于“安全原因”严格限制了两者之间的交互。我已经成功地从 Chrome/Firefox 控制台和 selenium 手动运行它。

以上是关于以编程方式在 Google Colab 中运行所有单元格命令的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Google Colab 断开连接?

运行 R 内核时如何在 google Colab 中访问 shell

如果我断开连接,Google Colab 会继续运行单元以将文件保存在已安装的驱动器中吗?

Google Colab 使用易错总结

如何使用 ngrok 公开在 localhost 上运行的 neo4j 实例以供 google colab 使用?

在 VM 引擎中导入 google.colab 不会让我在 Google Colab 中运行 Jupyter Notebook?