API调用场景下EasyOCR创建Reader实例触发UnicodeEncodeError问题求助
解决EasyOCR在Flask+Nginx环境下初始化时的UnicodeEncodeError
我之前也碰到过一模一样的问题,核心原因是EasyOCR下载模型时输出的进度条包含Unicode字符,而Flask服务进程的标准输出编码不是UTF-8,导致编码报错。下面给你几个可行的解决方案:
方案1:关闭EasyOCR的初始化进度条(最快捷)
直接在创建Reader实例时添加verbose=False参数,彻底跳过进度条的Unicode输出:
import easyocr # 关闭进度条,避免下载时的终端输出触发编码错误 oocr = easyocr.Reader(['en'], verbose=False)
这个方法直接绕过了编码问题,因为不会再打印带█的进度条了,适合快速解决问题。
方案2:确保服务进程的环境变量正确传递
你之前设置的PYTHONIOENCODING=utf8可能没生效,因为终端的环境变量不会自动继承给Nginx/Flask的后台进程。需要在服务配置里显式设置:
- 如果用
systemd管理Flask服务:在你的.service配置文件中添加一行:
然后重启服务:Environment=PYTHONIOENCODING=utf8sudo systemctl daemon-reload && sudo systemctl restart your-flask-service - 如果用
uWSGI部署:在uWSGI的配置文件(比如app.ini)中添加:
重启uWSGI服务即可。env = PYTHONIOENCODING=utf8
方案3:提前下载模型,避免运行时触发下载流程
先在服务器的Python环境中手动运行一次初始化代码,让EasyOCR把模型下载到本地:
import easyocr # 触发模型下载,完成后退出即可 reader = easyocr.Reader(['en'])
默认模型会存在~/.EasyOCR/model目录下,你也可以通过model_storage_directory参数指定自定义路径:
reader = easyocr.Reader(['en'], model_storage_directory='/opt/easyocr-models')
之后在API代码中使用相同的model_storage_directory参数,服务运行时就不会再触发下载,自然也不会有进度条输出了。
问题根源分析
当你直接在终端运行脚本时,终端的标准输出默认是UTF-8编码,支持█这类Unicode字符;但Flask+Nginx部署时,服务进程的标准输出可能被重定向到日志文件或Nginx的管道,此时默认编码可能被设置为ASCII,导致打印Unicode字符时抛出UnicodeEncodeError。而终端设置的环境变量不会自动传递给后台服务进程,所以需要在服务配置中显式指定编码。
内容的提问来源于stack exchange,提问作者Darkstar Dream
相关产品推荐
相关产品推荐

