You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:17:34