Python 3.12 升级:三个报错,一个只发警告
11 月第一周,构建镜像从 python:3.11-slim 换成 python:3.12-slim。本地 docker build 一次通过,CI 挂在 pip install。下面是三个报错,按出现顺序。
三个报错
第一个:ModuleNotFoundError: No module named 'distutils'。distutils 在 3.12 被移除,但 setuptools 65+ 自带 shim,正常不该报。问题在 Dockerfile 里两年前加的一行 ENV SETUPTOOLS_USE_DISTUTILS=stdlib——强制用标准库那份。3.11 里标准库还有,这行有效;3.12 里没了,它就成了隐患。删掉即好。
第二个:ModuleNotFoundError: No module named 'imp'。出在内部包 plugin_loader.py:31 的 imp.load_source。改成 importlib.util.spec_from_file_location 加 module_from_spec、exec_module,多四行。这接口 3.4 就有,一直没换只因为没报错。
第三个:AttributeError: module 'ssl' has no attribute 'wrap_socket'。3.7 起 deprecated,五年里每次调用刷一行 warning,没人管,因为还能跑。3.12 删了。换成 SSLContext 配 wrap_socket(server_hostname=...),顺手把 check_hostname 和 CERT_REQUIRED 显式打开——老接口默认不校验 hostname,正是它被删的原因之一。
没报错的那个
datetime.utcnow() 在 3.12 仍只发 DeprecationWarning。仓库里搜出 47 处,这次没动,记了个 issue。
- 点赞
- 收藏
- 关注作者
评论(0)