Fedora 32升级至33后dnf失效 提示缺少dnf Python模块
故障场景
按照dnf系统升级官方手册流程,将Fedora 32升级至Fedora 33并重启后,执行dnf check-update命令抛出如下错误:
Traceback (most recent call last): File "/usr/bin/dnf", line 57, in <module> from dnf.cli import main ModuleNotFoundError: No module named 'dnf'
已排查的信息
- 执行
rpm -qa python3的返回结果包含两个版本的Python3安装包:
可确认跨版本升级后,Fedora 32对应的旧版Python3包未被系统自动替换清理,通过python3-3.9.1-2.fc33.x86_64 python3-3.8.7-2.fc32.x86_64rpm -qa | sort的输出可交叉验证该残留情况。 - 执行
rpm -ql python3-3.8.7-2.fc32.x86_64查看旧包的文件占用列表,发现该残留包将系统默认python3命令的入口路径纳入自身安装文件范围,涉及路径包括:/usr/bin/pydoc /usr/bin/pydoc3 /usr/bin/pydoc3.8 /usr/bin/python3 /usr/bin/python3.8 /usr/lib/.build-id /usr/lib/.build-id/da /usr/lib/.build-id/da/2e3a5d2a850e1b6e560df11fa5d61a7192f954 /usr/share/doc/python3 /usr/share/doc/python3/README.rst /usr/share/man/man1/python3.1.gz /usr/share/man/man1/python3.8.1.gz - 排查过程中曾误将包名作为直接命令执行(未添加
rpm -ql查询参数),执行python3-3.8.7-2.fc33.x86_6时报错error: open of python3-3.8.7-2.fc33.x86_6 failed: No such file or directory,属于操作失误,不影响故障判断。
故障根因
残留的Fedora 32版Python 3.8包抢占了/usr/bin/python3的系统默认指向,而Fedora 33版本的dnf工具是绑定Python 3.9环境开发的,当前执行dnf脚本时会自动调用指向旧版本的Python3解释器,自然无法找到安装在Python 3.9模块路径下的dnf组件。
修复步骤
- 移除残留的旧版Python3包
由于rpm是独立二进制程序,不依赖当前python3的指向,可直接执行卸载命令清理残留包,添加--nodeps参数避免依赖关系错乱导致的卸载失败:rpm -e --nodeps python3-3.8.7-2.fc32.x86_64 - 重建默认python3软链接
旧包卸载完成后,原本被旧包占用的/usr/bin/python3路径会被一同删除,此时手动建立指向系统新版Python3.9的软链接:ln -sf /usr/bin/python3.9 /usr/bin/python3 - 验证并收尾
链接修复完成后,执行dnf check-update确认dnf可正常加载模块、无报错运行。验证通过后,可通过rpm -qa | grep fc32检索所有跨版本升级残留的fc32标签软件包,批量完成清理后重新拉取系统仓库元数据,确保所有包版本与Fedora 33源匹配。
内容的提问来源于stack exchange,提问作者aruku7230
相关产品推荐
相关产品推荐

