ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

pip install 报 TypeError: deprecated() got an unexpected keyword argument ‘name‘ 的排查与修复经验分享

pip install 报 TypeError: deprecated() got an unexpected keyword argument ‘name‘ 的排查与修复经验分享 1. 报错现场pip install 卡在 deprecated() 的 name 参数如果你在服务器上敲下pip install终端没有开始下载反而甩出一段红字TypeError: deprecated() got an unexpected keyword argument name那基本可以确定你遇到的不是网络问题也不是包本身坏了而是pip 和 setuptools 的版本对不上了。这个报错在 Python 3.8、3.9 这类稍老的环境里特别常见尤其是那些用系统自带 Python、或者长期没动过的虚拟环境。先说清楚它到底是怎么回事。deprecated()是 setuptools 内部用来标记「某个功能已废弃」的装饰器函数。新版 setuptools 给这个函数加了一个name关键字参数用来在警告信息里标明是哪个功能被弃用。而旧版 pip 在调用这个装饰器时传参方式还是老一套两边一碰Python 解释器就抛出unexpected keyword argument name。所以这个报错的本质是pip 太旧setuptools 太新或者反过来。它跟你的代码没关系跟你要装的包也没关系纯粹是工具链内部打架。适合谁看这篇正在用 SSH 连远程 Linux 服务器、用 pip 装包、被这个 TypeError 卡住的 Python 开发者。下面我会按「先定位版本 → 再修复 → 最后验证」的顺序把每一步命令都给全你照着敲就行。2. 先别急着升级定位 pip 与 setuptools 的真实版本很多人一看到报错就去搜「pip 升级命令」结果pip install --upgrade pip本身也报同样的错直接死循环。所以第一步不是升级是看清楚当前环境里到底装了什么版本。2.1 查看 pip、setuptools、Python 三者版本在报错的同一个终端里执行python -m pip --version python -m setuptools 2/dev/null || python -c import setuptools; print(setuptools, setuptools.__version__) python --version更稳妥的写法是用python -m pip而不是直接pip因为pip这个命令可能指向另一个 Python 环境而python -m pip一定用的是当前python对应的 pip。这一点在服务器上多版本 Python 共存时特别重要。正常输出大概长这样pip 21.0.1 from /usr/lib/python3.8/site-packages/pip (python 3.8) setuptools 68.0.0 Python 3.8.10如果你看到 pip 是 20.x、21.x 这种老版本而 setuptools 是 65 以上那基本就锁定问题了。2.2 确认报错发生在哪一层有时候报错信息里会带一段 traceback注意看最后几行的文件路径File /usr/lib/python3.8/site-packages/pip/_internal/..., line xx, in ... TypeError: deprecated() got an unexpected keyword argument name如果路径里是pip/_internal说明是 pip 在调用 setuptools 时崩的如果路径里是setuptools/...说明是 setuptools 自己初始化时崩的。两种情况修复方向略有不同但核心都是把两者版本拉到互相兼容的区间。提示如果你在虚拟环境里先which python和which pip确认路径别在系统 Python 和 venv 之间来回横跳那样版本会越查越乱。3. 可复制的修复配置分场景升级与约束定位完版本接下来是修复。这里给三套方案按「从轻到重」排列你优先试第一套不行再往下。3.1 方案一在能联网的前提下用 python -m pip 升级关键点用python -m pip而不是pip并且先升 setuptools 再升 pip顺序反了可能中途又崩。python -m pip install --upgrade setuptools70 python -m pip install --upgrade pip为什么给 setuptools 加70约束因为 setuptools 70 之后对旧 Python 的支持进一步收紧Python 3.8 环境下装最新版反而容易引入新的兼容问题。把 setuptools 控制在 69 及以下pip 升到 23.x 左右两者配合最稳。升级完再查一次版本python -m pip --version python -c import setuptools; print(setuptools.__version__)3.2 方案二pip 已经崩到无法执行任何命令如果python -m pip install也报同样的 TypeError说明 pip 的入口已经坏了。这时候用官方引导脚本重装curl -sS https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py python get-pip.py --user --force-reinstall--force-reinstall会覆盖掉坏掉的 pip--user表示装到用户目录避免动系统包。装完用python -m pip --version验证。如果服务器访问外网受限get-pip.py下载不下来那就走方案三。3.3 方案三用 requirements 约束文件锁死版本在项目里维护一个requirements-dev.txt把工具链版本写死避免下次又踩pip23.3.2 setuptools69.5.1 wheel0.43.0然后python -m pip install -r requirements-dev.txt这样团队里每个人、每台服务器装出来的工具链版本一致deprecated() got an unexpected keyword argument name这类问题就不会因为「谁的环境新谁的环境旧」而反复出现。注意约束文件里的版本号要和你实际 Python 版本匹配。Python 3.8 建议 pip 不超过 24setuptools 不超过 69Python 3.10 以上可以放宽。4. 验证请求确认 pip install 真的恢复正常修完不能只看版本号得实际装一个包验证。选一个体积小、依赖少的包比如sixpython -m pip install six成功的话会看到类似输出Collecting six Downloading six-1.16.0-py2.py3-none-any.whl (11 kB) Installing collected packages: six Successfully installed six-1.16.0再确认一下能正常导入python -c import six; print(six.__version__)输出1.16.0就说明整条链路通了。如果这一步还报deprecated()回到第 2 节重新查版本大概率是升级没生效——比如你升级的是系统 pip但实际用的是 venv 里的 pip。4.1 顺手验证 setuptools 的 deprecated 调用想更彻底一点可以直接测一下 setuptools 的装饰器是否正常python -c from setuptools import deprecated; print(setuptools deprecated ok)不报错就说明 setuptools 内部状态正常pip 再调用它就不会崩。5. 本篇常见错排查为什么升级了还是报错修复过程中有几个高频坑我一个个列出来。坑一升级命令本身报同样的错。这是最典型的死锁。解决办法是绕开 pip 的常规入口用get-pip.py --force-reinstall或者用系统包管理器先降级 setuptoolspython -m pip install setuptools58.0.0把 setuptools 降到旧版让 pip 能跑起来再升 pip。坑二多环境混淆。服务器上同时有/usr/bin/python3、/usr/local/bin/python3、conda 环境、venv。你升级了 A 环境的 pip却在 B 环境里执行 install。排查方法which -a python pip列出所有路径确认当前 shell 用的是哪一个。坑三缓存导致旧版本被复用。pip 有下载缓存偶尔会拿到旧的 wheel。加--no-cache-dir强制不走缓存python -m pip install --no-cache-dir --upgrade pip坑四权限问题伪装成版本问题。如果报错里混着Permission denied那可能是装到系统目录没权限。加--user装到用户目录或者进 venv 再操作。坑五网络中断导致升级只完成一半。升级 pip 时如果连接断了pip 可能处于「半安装」状态版本号显示新的但文件不全。这时候--force-reinstall重装一遍最干净。提示排查时养成习惯每改一步就python -m pip --version看一眼别一口气敲五条命令出问题不知道是哪条引起的。6. 把工具链版本管起来长期稳定的做法这个报错之所以烦是因为它会在不同机器上反复出现。与其每次救火不如把版本管理做成习惯。第一新环境初始化时先固定工具链python -m pip install --upgrade pip24 setuptools70 wheel第二项目根目录放requirements-dev.txt把 pip、setuptools、wheel 的版本写进去CI 和本地都用同一份。第三如果你在做长期编码或者 Agent 类项目需要频繁装依赖、跑脚本可以考虑用 Coding Plan 这类按需调用的方案来辅助生成和检查环境配置减少手动试错。入口在 https://taotoken.net/api 的 coding-plan 路径下配合接入文档一起看更顺。第四遇到 pip 相关报错先查版本再动手别盲目--upgrade。版本兼容问题定位永远比修复花的时间更值。最后留一个我常用的自检命令装完环境跑一遍心里有底python -m pip --version python -c import setuptools, wheel; print(setuptools, setuptools.__version__); print(wheel, wheel.__version__)三个版本号都正常打印pip install就不会再拿deprecated() got an unexpected keyword argument name来烦你了。
返回列表