使用Augmentor时触发OSError[Errno 5]输入输出错误的求助
问题根源分析
从报错栈能明确,不是图像目录的IO权限问题,而是tqdm进度条在刷新标准错误输出(sys.stderr)时触发的IO错误。Rocky Linux 9与CentOS 8的后台服务环境(比如systemd的输出处理逻辑)存在差异,Discord机器人后台运行时,stderr可能被重定向、关闭或无法正常写入,导致tqdm刷新失败。
解决方案
1. 直接禁用Augmentor的tqdm进度条(最有效)
Augmentor的sample方法支持关闭进度条,替换原有的p.process()调用即可,彻底避免对stderr的操作:
# 替换原来的p.process() p.sample(0, multi_threaded=True, disable_tqdm=True)
解释:p.process()内部实际调用的是self.sample(0, multi_threaded=True),手动调用时加上disable_tqdm=True就能跳过tqdm的初始化和刷新,从根源解决错误。
2. 重定向tqdm的输出到空设备
如果不想修改Augmentor的调用逻辑,可以在代码开头添加以下代码,强制tqdm将输出定向到空设备:
import sys from tqdm import tqdm # 让tqdm输出到/dev/null,避免操作stderr tqdm.set_defaults(file=open('/dev/null', 'w'))
3. 检查机器人的systemd服务配置
如果机器人是通过systemd服务运行,检查服务文件(比如/etc/systemd/system/discord-bot.service)的StandardError配置:
- 若设置为
StandardError=null,可以改为StandardError=journal+console或StandardError=journal,让stderr正常写入系统日志:
[Service] ... StandardError=journal+console
修改后执行以下命令生效:
systemctl daemon-reload systemctl restart discord-bot.service
内容的提问来源于stack exchange,提问作者dangerisgo
相关产品推荐
相关产品推荐

