安装OpenAI后,AWS ElasticBeanstalk上的Flask应用启动失败求助
问题描述
环境:AWS ElasticBeanstalk AL2 EC2实例,运行Python3.8版本的Flask应用。
安装OpenAI Python包后,EB实例启动失败,日志报错如下:
from openai import OpenAI web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/openai/__init__.py", line 8, in <module> web: from . import types web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/openai/types/__init__.py", line 5, in <module> web: from .batch import Batch as Batch web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/openai/types/batch.py", line 7, in <module> web: from .._models import BaseModel web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/openai/_models.py", line 25, in <module> web: from ._types import ( web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/openai/_types.py", line 21, in <module> web: import httpx web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpx/__init__.py", line 2, in <module> web: from ._api import delete, get, head, options, patch, post, put, request, stream web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpx/_api.py", line 6, in <module> web: from ._client import Client web: File "<frozen importlib._bootstrap>", line 991, in _find_and_load web: File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked web: File "<frozen importlib._bootstrap>", line 671, in _load_unlocked web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/newrelic/api/import_hook.py", line 174, in exec_module web: self.loader.exec_module(module) web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpx/_client.py", line 32, in <module> web: from ._transports.default import AsyncHTTPTransport, HTTPTransport web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpx/_transports/default.py", line 32, in <module> web: import httpcore web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpcore/__init__.py", line 1, in <module> web: from ._api import request, stream web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpcore/_api.py", line 5, in <module> web: from ._sync.connection_pool import ConnectionPool web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpcore/_sync/__init__.py", line 1, in <module> web: from .connection import HTTPConnection web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpcore/_sync/connection.py", line 12, in <module> web: from .._synchronization import Lock web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/httpcore/_synchronization.py", line 11, in <module> web: import trio web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/trio/__init__.py", line 26, in <module> web: from . import abc, from_thread, lowlevel, socket, to_thread web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/trio/socket.py", line 16, in <module> web: from . import _socket web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/trio/_socket.py", line 526, in <module> web: class SocketType: web: File "/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages/trio/_socket.py", line 719, in SocketType web: @_wraps(_stdlib_socket.socket.sendmsg, assigned=(), updated=()) web: AttributeError: type object 'GreenSocket' has no attribute 'sendmsg' web: [2024-07-29 21:44:08 +0000] [25719] [INFO] Worker exiting (pid: 25719)
已尝试更换OpenAI及相关依赖版本,移除OpenAI包后Worker可正常启动。
错误根源
日志显示,trio库导入时尝试包装标准库socket.sendmsg方法,但当前环境中的socket被替换为GreenSocket(来自gevent或New Relic的猴子补丁),而GreenSocket没有sendmsg属性,导致冲突报错。该问题是OpenAI依赖的httpx/httpcore引入trio后,与EB环境中的gevent/New Relic工具的socket修改逻辑不兼容所致。
解决方案
方案一:固定兼容版本的依赖
在requirements.txt中指定以下兼容Python3.8且避免冲突的版本:
openai==1.30.5 httpx==0.27.0 httpcore==1.0.5 trio==0.24.0
重新部署EB应用,让环境安装指定版本的依赖。
方案二:修改OpenAI客户端传输方式,规避异步依赖
初始化OpenAI客户端时,指定同步HTTP传输,避免加载trio等异步库:
from openai import OpenAI from httpx import HTTPTransport client = OpenAI( # 建议通过环境变量获取API密钥,避免硬编码 api_key="your-api-key", transport=HTTPTransport( http2=False # 禁用HTTP2,强制使用同步传输 ) )
方案三:禁用New Relic对socket模块的监控(若不需要该监控)
在EB的环境变量中添加:
NEW_RELIC_SKIP_INSTRUMENTATION=socket
或修改New Relic配置文件newrelic.ini,添加如下配置:
[instrumentation] skip_instrumentation = socket
内容的提问来源于stack exchange,提问作者io123123
相关产品推荐
相关产品推荐

