我们需要查看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
关于如何使用它的任何想法?
我刚刚发现forever
没有转发来自app.js
的输出。 forever list
建议输出将转到/content/.forever/BQBW.log
,该输出不存在。我仍然不明白为什么也不是stdout的最终结果。
答案 0 :(得分:1)
使用wurlitzer。这是一个完整的示例:
https://colab.research.google.com/drive/1jpAOdWJDCh_YzmqidGnlYHHCFODNKQkB
此笔记本
答案 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})都应显示在单元格的输出中。