在 Google Colab 中获取 jupyter 输出

Getting jupyter output in Google Colab

我们需要在 google colab 中查看 jupyter notebook 生成的输出 (stdout)。做一些调查似乎输出一直通过管道传输到主进程:[​​=15=]

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

输出运行的管道好像是这样的:

关于如何访问它有什么想法吗?


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

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

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

这个笔记本:

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

您正在寻找的输出是来自您的代码还是来自 Jupyter 本身?

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

我最终为 cout 和 py::print 编写了一个 c++ 包装器,可用于启用或禁用 [​​=14=] 打印。考虑到我需要更改我的整个 C++ 源代码以使用包装器而不是 std::cout.

,这真是令人作呕

(我知道你已经畅通无阻,但在这里留下这个答案希望能帮助未来的旅行者)

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

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