Jupyter Notebook单元格无法执行完成,报I/O操作已关闭文件错误
Jupyter Notebook单元格执行报错:I/O operation on closed file
问题描述
在Jupyter Notebook中运行Python代码时,单元格无法执行完成并抛出错误,但相同代码在命令行环境下可正常运行。
报错信息
[IPKernelApp] ERROR | Exception in message handler: Traceback (most recent call last): File "/Users/burcakotlu/developer/python/test_venv/lib/python3.9/site-packages/ipykernel/kernelbase.py", line 424, in dispatch_shell await result File "/Users/burcakotlu/developer/python/test_venv/lib/python3.9/site-packages/ipykernel/kernelbase.py", line 770, in execute_request sys.stderr.flush() ValueError: I/O operation on closed file. [IPKernelApp] ERROR | Error in message handler Traceback (most recent call last): File "/Users/burcakotlu/developer/python/test_venv/lib/python3.9/site-packages/ipykernel/kernelbase.py", line 529, in dispatch_queue await self.process_one() File "/Users/burcakotlu/developer/python/test_venv/lib/python3.9/site-packages/ipykernel/kernelbase.py", line 518, in process_one await dispatch(*args) File "/Users/burcakotlu/developer/python/test_venv/lib/python3.9/site-packages/ipykernel/kernelbase.py", line 437, in dispatch_shell sys.stderr.flush() ValueError: I/O operation on closed file.
环境依赖版本
$ pip list | grep -E "(^jup|^ipy)" ipykernel 6.27.1 ipython 8.18.1 jupyter_client 8.6.0 jupyter_core 5.5.0
解决方案
针对sys.stderr.flush()触发的关闭文件I/O错误,可按以下步骤排查修复:
检查代码对标准流的修改
排查代码中是否存在手动关闭sys.stderr/sys.stdout,或重定向到已关闭文件对象的操作。命令行与Jupyter的标准流管理逻辑不同,这类操作在Notebook中会导致内核输出异常。若有此类操作,确保执行完相关逻辑后恢复标准错误流。重置内核并重启Notebook
内核可能因之前的异常操作处于异常状态,关闭当前Notebook,重启Jupyter服务后重新启动内核,再运行代码测试。降级ipykernel版本
部分新版本ipykernel存在标准流处理bug,尝试降级到稳定版本:pip install ipykernel==6.25.2安装完成后重启内核验证。
修复虚拟环境依赖
若虚拟环境依赖损坏,重新安装核心Jupyter组件:pip uninstall -y ipykernel ipython jupyter_client jupyter_core pip install ipykernel ipython jupyter_client jupyter_core规范标准流操作方式
若需临时重定向输出,使用上下文管理器确保标准流能恢复:import sys from io import StringIO old_stderr = sys.stderr sys.stderr = StringIO() try: # 执行目标代码 pass finally: sys.stderr = old_stderr
内容的提问来源于stack exchange,提问作者burcak
相关产品推荐
相关产品推荐

