【问题标题】:Access other Cell Contents within cell (Colab)访问单元格内的其他单元格内容 (Colab)
【发布时间】:2021-06-21 11:53:36
【问题描述】:

大家下午好!

Google Colab 和我似乎对什么是可能的或不可能有不同的看法...... 我只是想要一种从单元格内访问所有其他单元格内容的方法。

我的用例是,我想将当前 Colab Notebook 的内容发布到外部服务器,以便以最少的用户交互(仅运行单元格)进行评分。

所以我的问题是:有没有办法以编程方式访问 Colab NB 的代码单元?

我看到了 Jupyter NB 的 this answer,但它在 Google Colab 中不起作用,因为 Jupyter JS-Variable 不可用。变量google.colab 似乎没有提供相同的功能,还是我遗漏了什么?

Google Colab 似乎在其一个 iframe 中对每个单元格进行沙箱处理,因此我无法通过 JS 查询其他单元格的内容:

    %%js
    document.getElementsByClassName('cell')

当在单元格中运行时,这只会导致一个空的 HTMLCollection,当在我的浏览器的开发者工具中运行时,我会得到正确的结果。

我在这里遗漏了什么吗?有没有办法逃离沙箱或访问 Python 单元格中的当前 NB 内容?

提前感谢您的帮助!

【问题讨论】:

    标签: python jupyter-notebook google-colaboratory


    【解决方案1】:

    当然,这是一个完整的示例: https://colab.research.google.com/drive/1mXuyMsPEXFU4ik9EGLBiWUuNfztf7J6_

    关键位是这样的:

    # Obtain the notebook JSON as a string
    from google.colab import _message
    notebook_json_string = _message.blocking_request('get_ipynb', request='', timeout_sec=5)
    

    从笔记本复制执行的示例:

    【讨论】:

    • 太棒了,正是我想要的!但是为什么没有这方面的文档(或者我太愚蠢了)找不到这个? blocking_request 没有关于 request_types 可用内容的文档
    • 另外我认为您在链接中错过了一个_
    • 感谢链接修复编辑。 _message 模块不是公共 API 的一部分,因此如果不阅读 code 就很容易错过。但是,它会如您所愿。
    【解决方案2】:

    可能不是一个理想的解决方案 - 但一种选择可能是直接读取笔记本文件,而不是尝试在内部访问单元格。以下代码将用户的谷歌驱动器安装在笔记本中,以便您可以将其内容作为文件读取:

    from pathlib import Path
    from google.colab import drive
    
    # Mount the users google drive into the notebook (takes the
    # user to an auth flow for access).
    drive.mount('/content/drive')
    
    # Read the contents of the notebook file to POST to grading server.
    base = Path('/content/drive/MyDrive/Colab Notebooks')
    notebook_path = 'notebook.ipynb'
    with open(base / notebook_path) as infile:
      notebook_contents = infile.read()
    

    查找笔记本的路径似乎很棘手,但如果它有一个标准名称,您可以使用 base.rpath('*.ipynb') 搜索它,并为用户提供一些要提交的文件选项。

    【讨论】:

    • 谢谢西蒙,我真的希望有一个更直接的解决方案,例如通过 JS。
    • 我也可以添加到您的解决方案中,您可以通过:unquote(get('http://172.28.0.2:9000/api/sessions').json()[0]['name']) 获取当前文件的名称,或者也可以通过会话获取驱动器文件 id (path)!
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多