Docker容器中用Supervisord启动Python应用遇typing.Literal属性错误
问题:Docker容器中使用supervisord运行Python应用启动失败,出现
typing.Literal属性错误 启动时出现如下错误日志:
*** Operational MODE: preforking+threaded *** Traceback (most recent call last): File "./main.py", line 11, in <module> from flask_log_request_id.extras.celery import enable_request_id_propagation File "/usr/local/lib/python3.9/dist-packages/flask_log_request_id/__init__.py", line 2, in <module> from .request_id import RequestID, current_request_id File "/usr/local/lib/python3.9/dist-packages/flask_log_request_id/request_id.py", line 4, in <module> from flask import request, g, current_app File "/usr/local/lib/python3.9/dist-packages/flask/__init__.py", line 1, in <module> from . import json as json File "/usr/local/lib/python3.9/dist-packages/flask/json/__init__.py", line 6, in <module> from ..globals import current_app File "/usr/local/lib/python3.9/dist-packages/flask/globals.py", line 6, in <module> from werkzeug.local import LocalProxy File "/usr/local/lib/python3.9/dist-packages/werkzeug/__init__.py", line 1, in <module> from .serving import run_simple as run_simple File "/usr/local/lib/python3.9/dist-packages/werkzeug/serving.py", line 76, in <module> t.Union["ssl.SSLContext", t.Tuple[str, t.Optional[str]], t.Literal["adhoc"]] AttributeError: module 'typing' has no attribute 'Literal' unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. GAME OVER ***
解决方法
确认运行环境的Python版本
容器中可能存在多版本Python,supervisord可能调用了低于3.8的版本(typing.Literal在Python3.8及以上才纳入标准库)。- 在容器内执行
python --version验证当前默认Python版本; - 在supervisord的配置文件中明确指定Python3.9的执行路径,例如:
[program:myapp] command=/usr/bin/python3.9 ./main.py
- 在容器内执行
移除第三方
typing包
Python3.5及以上自带标准库typing,若安装了第三方typing包会覆盖标准库,旧版本第三方typing没有Literal属性。执行命令卸载:pip uninstall -y typing调整Werkzeug依赖版本
若Werkzeug版本过高导致与当前环境不兼容,可指定兼容Python3.9的版本。在requirements.txt中添加:werkzeug==2.0.3然后重新安装依赖:
pip install -r requirements.txt
内容的提问来源于stack exchange,提问作者Satish Lokhande
相关产品推荐
相关产品推荐

