【问题标题】:Getting jupyter output in Google Colab在 Google Colab 中获取 jupyter 输出
【发布时间】:2018-06-28 03:05:50
【问题描述】:

我们需要查看由 google colab 中的 jupyter notebook 生成的输出(stdout)。做一些调查,似乎输出一直到主进程:

root 1 0 0 Jun27 ? 00:00:00 /bin/bash -e /datalab/run.sh

输出所经过的管道似乎如下:

  • /usr/bin/python2 /usr/local/bin/jupyter-notebook .....

  • /tools/node/bin/node /datalab/web/app.js

  • 节点 /tools/node/bin/forever ..... /datalab/web/app.js

  • /bin/bash -e /datalab/run.sh

关于如何访问它的任何想法?


我刚刚发现forever 不会转发来自app.js 的输出。 forever list 表示输出将转到不存在的 /content/.forever/BQBW.log。我仍然不明白为什么也不明白这是否真的是 stdout 的最终结果。

【问题讨论】:

    标签: bash shell jupyter-notebook stdout google-colaboratory


    【解决方案1】:

    使用wurlitzer。这是一个完整的例子:

    https://colab.research.google.com/drive/1jpAOdWJDCh_YzmqidGnlYHHCFODNKQkB

    这个笔记本:

    1. 保存打印到标准输出的 C 文件。
    2. 编译为共享库。
    3. 将共享库加载到正在运行的 Python 后端。
    4. 在调用库时使用 wurlitzer 捕获输出。

    【讨论】:

    • 非常感谢,在 colab 和本地使用 jupyter 测试了 wurlitzer,但我仍然没有得到输出。在程序中,内核正在死去,这就是我需要输出的原因。尽管垂死 wurlitzer.sys_pipes 应该给我一些东西。在本地 jupyter shell 中,我得到了输出。使用 sys_pipes 时,不仅 shell 输出消失了,而且我在 jupyter 中也没有得到任何东西。
    【解决方案2】:

    (我知道您已畅通无阻,但将此答案留在这里希望对未来的旅行者有所帮助)

    Wurlitzer 使用一个线程来刷新它的管道,我猜你的 C++ 代码在它的管道被刷新之前就崩溃了。 https://colab.research.google.com/drive/1i6x882Dn6E5PwaptVQ4ADGyEvBZAHm7i 显示了一个示例,其中 TF C++ 代码将开发位置发送到 stderr,然后在执行完成之前被终止。快速刷新会导致在内核被杀死之前显示所有输出,但将其保留为默认值(0.2s)会导致部分输出或不显示输出。

    如果您想要的输出是在进程死亡之前的断言/致命消息,那么 wurlitzer 的方法不太适合您,并且作为子进程运行可能是更快的迭代路径,例如将单元格中的代码写入文件,例如使用%%writefile,然后运行一个子进程python,如: !python3 file.py 子进程发出的任何 stdout/stderr(无论是从 python 代码写入 sys.std{out,err} 还是从 C++ 代码写入 fd={1,2})都应显示在单元格的输出中。

    【讨论】:

      【解决方案3】:

      您要查找的输出是来自您的代码还是来自 Jupyter 本身?

      如果是 jupyter,启用日志记录需要做一些工作——这是一个完整的例子:https://colab.research.google.com/drive/1q2mhsj4bwwdQK-KZIxrIIKed8O11MQl0

      【讨论】:

      • 我尝试了with capture_logs(): my_codewith print_logs(): my_code,但它不起作用。我认为这不是 jupyter 的输出。我在 shell 中启动 jupyter-notebook,在同一个 shell 中,我看到了 c++ 代码的输出。但在我的理解中,c++ 直接(而不是通过 jupyter)打印到那个 shell。我也尝试了更高的日志级别。
      • 我仍然不认为我明白你在做什么,但听起来你已经解封了;将来,共享带有示例代码的笔记本可能是最有效的。
      • 我很想分享,但是以我设置的方式分享一个支持 c++ 代码的笔记本非常困难。我已经花了 2 天多的时间让它在 colab 上运行
      【解决方案4】:

      我最终为 cout 和 py::print 编写了一个 c++ 包装器,可用于启用或禁用 python 打印。考虑到我需要更改整个 c++ 源代码以使用包装器而不是 std::cout,这非常令人作呕。

      【讨论】:

        猜你喜欢
        • 2020-09-03
        • 2018-11-04
        • 2021-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 1970-01-01
        • 2021-04-21
        • 2019-07-08
        相关资源
        最近更新 更多