OpenCV(imread)操作卡在弹性豆茎中
Posted
技术标签:
【中文标题】OpenCV(imread)操作卡在弹性豆茎中【英文标题】:OpenCV(imread) operation stuck in elastic beanstalk 【发布时间】:2018-12-09 23:11:33 【问题描述】:我正在尝试读取一个 png 文件并使用服务器上的 opencv 的 imread 函数在终端中输出图像的 numpy 矩阵,如下所示
import cv2
from flask import Flask
import os
@application.route('/readImage',methods=['POST'])
def handleHTTPPostRequest():
imagePath = f'os.getcwd()/input.png'
print('image path is', imagePath)
print(cv2.__version__)
im = cv2.imread(imagePath,cv2.IMREAD_COLOR)
print(im)
return 'success'
无论我执行多少次,这都会在我的本地机器(Ubuntu 18.04)上给出预期的输出。我通过必要的设置将其移至弹性 beantalk(CentOS)。我第一次拨打电话时,请求运行良好(提供正确的日志以及成功)。 但是当我第二次进行 post 调用时,它只输出前两个日志(imagepath 和 cv2 版本)并且卡在那里一段时间。一段时间后,它显示此错误
End of script output before headers: application.py
我在 cv2.imread 之前又添加了一行,以确保文件存在
print('does the file exists',os.path.isfile(imagePath) )
这每次都返回 true。我已经多次重新启动服务器,看起来它只在第一次工作,并且 cv2.imread() 在第一次调用后卡住了。我错过了什么
【问题讨论】:
【参考方案1】:当您从请求处理程序中 print
时,Flask 会尝试做一些明智的事情,但 print
确实不是您想要做的事情,因为它可能会导致 HTTP 请求/响应簿记失效。
从处理程序中获取诊断信息的一种完全受支持的方法是使用logging
模块。它将需要一些配置。见http://flask.pocoo.org/docs/1.0/logging/
【讨论】:
感谢您告诉我。您认为删除所有打印语句会防止问题发生吗 我问的原因是因为这只会影响 opencv imread 功能,而且也只会在第一次请求之后 尝试删除打印语句。看起来.imread()
可能是问题所在,但它可能是下一次打印尝试。
如果你注释掉 cv2.imread() 行(以及它下面的打印),你会得到一些关于 cv2 是否与问题有关的迹象。【参考方案2】:
对于遇到此问题的任何人,我找到了solution。将此添加到您的 ebextensions 配置文件中
container_commands:
AddGlobalWSGIGroupAccess:
command: "if ! grep -q 'WSGIApplicationGroup %GLOBAL' ../wsgi.conf ; then echo 'WSGIApplicationGroup %GLOBAL' >> ../wsgi.conf; fi;"
【讨论】:
【参考方案3】:Saikiran 的最终解决方案对我有用。当我尝试从 opencv-python 库调用方法时,我遇到了这个问题。我在本地运行 Ubuntu 18.04,它在那里运行良好。但是,就像 Saikiran 的原始帖子一样,当部署到 Elastic Beanstalk 时,第一个请求有效,然后第二个请求无效。对于我的 EB 环境,我使用的是基于 Python3.6 的 Amazon Linux 服务器。
【讨论】:
这似乎不是一个完整的独立答案。你可以再看看How to Answer以上是关于OpenCV(imread)操作卡在弹性豆茎中的主要内容,如果未能解决你的问题,请参考以下文章
芹菜工人在 aws 弹性豆茎中失败 [退出:芹菜工人(退出状态 1;未预期)]