繁体   English   中英

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

[英]“Run all cells” command in Google Colab programmatically

我需要以编程方式从 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()但问题一直都是一样的:这些的根 object 是什么命令? 我试过document. window. 但结果是“未定义”或“不是函数”。 我认为我可以在如下字符串中调用 runall() 命令:

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

我对前端 / js 非常糟糕,并且很难在混淆代码中找到一些东西,但是如果我们在 javascript 代码中有这样的 function 作为.runAll()连接到所需的菜单项,我可以从控制台以编程方式运行它或 javascript 注入

或者也许可以将键盘事件Ctrl + F9发送到某个元素以运行此命令,因此问题是发送键盘事件所需的 object 是什么

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

这是一个 function 以编程方式运行所有单元:

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

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

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

我还发现了许多其他有趣且有用的命令,例如this.notebook.getKernel().isRunning()c.notebook.getKernel().restart()但问题一直都是一样的:这些的根 object 是什么命令?

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

colab.global.notebook.kernel.restart()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM