Imageio在Heroku部署时只读文件系统错误求助(pytesseract场景)
解决Heroku上imageio创建临时BMP文件的只读文件系统错误
你遇到的问题核心是Heroku的文件系统限制:Heroku仅允许/tmp目录作为可写的临时存储区域,而imageio默认的临时文件路径没指向这个目录,甚至出现了路径拼接错误(比如日志里的/tmptess_105rvap2.bmp少了/tmp/后的斜杠,导致尝试写入只读的根目录)。下面是几个可行的解决方案:
方案1:手动指定临时文件到/tmp目录
在代码里显式创建放在/tmp的临时文件,避免imageio使用错误路径:
import tempfile import imageio import pytesseract import os # 创建一个位于/tmp目录下的临时BMP文件 with tempfile.NamedTemporaryFile(suffix='.bmp', dir='/tmp/', delete=False) as tmp_file: temp_bmp_path = tmp_file.name # 读取源图片并写入指定的临时文件 source_image = imageio.imread(your_scanned_image_source) # 替换为你的源图片读取逻辑 imageio.imwrite(temp_bmp_path, source_image) # 用pytesseract处理临时BMP文件 ocr_text = pytesseract.image_to_string(temp_bmp_path) # 可选:用完后手动删除临时文件(Heroku会定期自动清理/tmp,也可以省略此步骤) os.unlink(temp_bmp_path)
方案2:设置imageio全局临时目录
通过环境变量让imageio默认将临时文件放在/tmp,无需修改每一处临时文件创建逻辑:
方式A:通过Heroku后台设置环境变量
在Heroku应用的「设置」页面添加环境变量:IMAGEIO_TEMP_DIR=/tmp/
方式B:在代码开头设置
import os os.environ['IMAGEIO_TEMP_DIR'] = '/tmp/' # 之后正常使用imageio和pytesseract即可 import imageio import pytesseract
额外优化:确保pytesseract也使用/tmp
pytesseract自身也会生成临时文件,建议一并指定它的临时目录:
# 配置pytesseract使用/tmp作为临时存储目录 custom_tess_config = r'--tmpdir "/tmp"' ocr_text = pytesseract.image_to_string(your_image, config=custom_tess_config)
方案原理说明
Heroku的文件系统除/tmp外均为只读,所有需要写入的临时文件必须放在这个目录。你的错误日志显示imageio尝试写入/tmptess_105rvap2.bmp——这是典型的路径拼接错误(缺少/tmp与文件名之间的斜杠),导致它试图写入只读的根目录,指定正确的/tmp路径即可解决该问题。
内容的提问来源于stack exchange,提问作者Hunaidkhan
相关产品推荐
相关产品推荐

