Papermill执行Jupyter Notebook时标准输出重定向失效问题咨询
解决Papermill执行Notebook时Stdout无法重定向的问题
问题本质
你碰到的核心问题是:redirect_stdout只能捕获当前Python进程的标准输出,但Papermill执行Notebook时会启动独立的Jupyter Kernel子进程——子进程的stdout不受当前进程重定向规则约束,会直接打印到控制台。另外你传入的stdout_file=buf用了io.StringIO内存对象,子进程无法向这个内存对象写入数据,所以这个参数也没起到预期作用。
可行解决方案
改用磁盘临时文件来接收输出,子进程可以正常写入磁盘文件,之后你再读取文件内容即可。示例代码如下:
import tempfile import os import papermill as pm from contextlib import redirect_stdout # 创建临时文件,用于接收Papermill和当前进程的输出 with tempfile.NamedTemporaryFile(mode='w+', encoding='utf-8', delete=False) as tmp_file: # 同时重定向当前进程的stdout到临时文件 with redirect_stdout(tmp_file): pm.execute_notebook( path, path, progress_bar=False, stdout_file=tmp_file.name, # 传入临时文件路径 stderr_file=tmp_file.name, parameters=dict(**params) ) print("!!! redirected !!!") # 读取临时文件中的所有输出 with open(tmp_file.name, 'r', encoding='utf-8') as f: all_output = f.read() print("捕获到的所有输出:") print(all_output) # 清理临时文件 os.unlink(tmp_file.name)
补充说明
- Papermill的
stdout_file和stderr_file参数既支持文件路径字符串,也支持可写入的文件对象,但只有磁盘文件能被子进程正常访问,内存对象(如StringIO)无法被跨进程写入。 - 如果不需要捕获当前进程的
print输出,可以去掉redirect_stdout部分,直接用临时文件接收Papermill的输出即可。
内容的提问来源于stack exchange,提问作者Asfandyar Abbasi
相关产品推荐
相关产品推荐

