SageMaker Jupyter导入weasyprint报OutStream无buffer属性错误如何解决
问题排查与修复方案
问题成因
- 根因为weasyprint依赖库pydyf的新版本和SageMaker Notebook的IPython运行环境不兼容:SageMaker Jupyter环境中的
sys.stdout是IPython封装的OutStream对象,没有原生标准输出的buffer属性;新版pydyf在PDF类的write方法默认参数中直接引用了sys.stdout.buffer,模块导入阶段就会触发属性访问失败,直接抛出异常。 - 此前3个月运行正常是因为当时拉取的是旧版本的pydyf/weasyprint,你当前的pip安装命令没有固定依赖版本,每次实例启动都会拉取最新版weasyprint,近期weasyprint版本迭代后依赖的pydyf同步更新,就触发了兼容问题。
修复方案
两种方案都可通过代码直接实现,适配你的生命周期自动运行规则:
方案1:固定weasyprint到兼容旧版本(推荐)
将安装weasyprint的命令替换为固定版本的命令,稳定性更高:
!{sys.executable} -m pip install weasyprint==57.2
57.2为经过验证的兼容版本,不会触发该导入错误。
方案2:临时修复stdout属性(适配新版weasyprint)
如果需要使用新版weasyprint的功能,可在导入weasyprint之前给sys.stdout打补丁补全buffer属性:
import sys # 兼容IPython OutStream无buffer属性的问题 if not hasattr(sys.stdout, 'buffer'): setattr(sys.stdout, 'buffer', sys.stdout) from weasyprint import HTML
补充说明
你安装的wkhtmltopdf为Python封装包,实际运行pdfkit时还需要SageMaker实例安装系统级wkhtmltopdf二进制依赖,若后续使用pdfkit时报错,可在生命周期配置中添加sudo yum install -y wkhtmltopdf命令安装对应依赖。
内容的提问来源于stack exchange,提问作者vee44
相关产品推荐
相关产品推荐

