在Google Colab中获取Jupyter输出

时间:2018-06-28 03:05:51

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

我们需要查看Google colab中jupyter笔记本生成的输出(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

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

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

关于如何使用它的任何想法?


我刚刚发现forever没有转发来自app.js的输出。 forever list建议输出将转到/content/.forever/BQBW.log,该输出不存在。我仍然不明白为什么也不是stdout的最终结果。

4 个答案:

答案 0 :(得分:1)

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

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

此笔记本

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

(我知道您没有阻碍,但请在此处保留此答案以希望对将来的旅行者有所帮助)

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

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