呼叫笔记本时在终端上显示日志输出

时间:2019-03-06 19:32:26

标签: python-3.x logging jupyter-notebook

我想从python bash脚本执行笔记本,并在终端中显示所有日志记录输出。 问题是仅显示main.sh脚本的输出,而不显示笔记本foo.ipynb的输出。

我已经尝试通过Internet为记录器设置不同的设置,但是没有使它起作用。有什么想法如何正确设置记录器配置?

这里是一个例子:

main.sh

#!/usr/bin/python3

import subprocess
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("Calling Notebook...")
subprocess.check_call("jupyter nbconvert --to notebook --execute --inplace foo.ipynb",  shell=True)
logger.info("Finished")

foo.ipynb

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info('Start ...')
a = 3
logger.info('End...')

我找不到适合记录器的配置,以使记录器无法在终端上查看笔记本中的记录语句。

运行./main.sh

后的输出
INFO:__main__:Calling Notebook...
[NbConvertApp] WARNING | Config option `template_path` not recognized by `NotebookExporter`.
[NbConvertApp] Converting notebook foo.ipynb to notebook
[NbConvertApp] Executing notebook with kernel: python3
[NbConvertApp] Writing 983 bytes to foo.ipynb
INFO:__main__:Finished

2 个答案:

答案 0 :(得分:2)

问题似乎是jupyter进程正在捕获stderr流,而不是将其重定向到终端。我会尝试先添加开关--stderr

subprocess.check_call("jupyter nbconvert --to notebook --stderr --execute --inplace foo.ipynb",  shell=True)

,如果失败,请尝试同时添加--stdout或代替--stderr。最后,我在一些地方读过您需要使用--to html来代替其他选项,以便接收stdout / stderr消息。因此,您可能需要尝试:

subprocess.check_call("jupyter nbconvert --to html --stdout --stderr --execute --inplace foo.ipynb",  shell=True)

或者可能没有--stderr,如果它抱怨这不是一个有效的选项(无法直接对其进行测试,找不到任何官方文档,我偶然发现了几个摘要)使用它。)

希望其中之一将迫使jupyter将您的stderr流重定向到终端。

答案 1 :(得分:1)

调用子进程时,将使用单独的外壳执行脚本foo.py,因此将在该外壳上进行日志记录。如果希望将所有日志记录信息保存在同一文件中,请使用记录器文件获取日志记录数据。

logging.basicConfig(filename =“ logging.log”,         level = logging.DEBUG,format ='%(asctime)s-%(relativeCreated)6d-%(threadName)s-%(message)s',filemode ='a')

相关问题