python - Jupyter Notebook Logging ValueError: I/O Operation on Closed File
问题描述
我正在尝试将日志记录添加到一些 Jupyter Notebook 代码(运行 Pyspark3)。
挖掘所以我发现了一些说 usingbasicConfig()
不起作用的答案,因为笔记本开始了自己的日志记录会话。一些解决方法的答案指向运行reload(logging)
来解决这个问题。考虑到这一点,我正在像这样设置我的日志记录:
from importlib import reload # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(
format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
level=logging.INFO,
datefmt="%y/%m/%d %H:%M:%S",
)
logger = logging.getLogger(__name__)
然后我运行一条信息语句:logger.info("this is a test")
我得到一个 I/O 值错误?我不确定这意味着什么。
--- Logging error ---
Traceback (most recent call last):
File "/usr/lib64/python3.6/logging/__init__.py", line 994, in emit
stream.write(msg)
File "/tmp/2950371398694308674", line 534, in write
super(UnicodeDecodingStringIO, self).write(s)
ValueError: I/O operation on closed file
Call stack:
File "/tmp/2950371398694308674", line 700, in <module>
sys.exit(main())
File "/tmp/2950371398694308674", line 672, in main
response = handler(content)
File "/tmp/2950371398694308674", line 318, in execute_request
result = node.execute()
File "/tmp/2950371398694308674", line 229, in execute
exec(code, global_dict)
File "<stdin>", line 1, in <module>
Message: 'this is a test'
Arguments: ()
这与记录与 stdout/stderr 交互有关,但我不知道如何解决它。
解决方案
在我上面的评论之后,我来解决这个问题。
问题似乎是sys.stdout
火花不能很好地发挥作用,或者至少在 jupyter 使用时不能很好地发挥作用;sys
您可以通过制作一个新的(Pyspark3)笔记本,导入,然后在不同的单元格中打印来轻松验证这一点sys.stdout
:它们将打印不同的对象(在我的情况下,它们中有 4 个,并且在它们之间循环,但我不能确定为什么是 4;也许它是我的集群配置所特有的,但它没有改变,因为我改变了 exec 的数量,或者每个 exec 的核心)。
我的解决方法是:
logger = logging.getLogger(__name__)
logger.handlers[0].stream.write = print
这是有效的,因为我知道我的记录器只有一个处理程序,它是sys.stdout
. 如果您的记录器中有更多处理程序(例如,一个标准输出和一个文件),我还没有弄清楚如何只更改stdout
一个(我无法比较if stream == sys.stdout
,因为问题的整个根源意味着对象将发生变化,除非您在创建记录器的同一单元格中执行此操作),因此此解决方法可能并不适合所有人。
如果我进一步发展,我会用更好的解决方案编辑答案,但我现在正在使用它,它就像一个魅力。
推荐阅读
- node.js - 仅从 sequelize junction 模型返回指定的关联模型
- java - 绘制后如何使画布变白?
- python - 对于每一行,循环遍历具有 Pandas 值的每一列
- javascript - URL查询参数是如何产生的?
- reactjs - 我获取 this.props.children 里面的数据;
- c++ - Qt 输入音频测量
- reactjs - 经bcrypt授权后Expressjs无法在reactjs前端设置cookie
- visual-studio-code - 在 Visual Studio Code 中使用外部库 Poco(通过 vcpkg 安装)时的 Cmake 未定义引用
- email - 当我尝试运行此 VB 脚本时,它显示“需要对象”,但我找不到错误
- android - 无法从 firebase 实时数据库中检索数据到 recyclerview