python3 错误、分析、解决 Traceback (most recent call last)
一、先知
要解决 模块 和 so 文件不存在问题,先要知道旧的环境中 相应文件位置
看这篇文章:
https://www.cnblogs.com/wutou/p/17534693.html
二、报错内容:
ubuntu1804编译升级 Python3.8.0 打不开终端、输入不存在的命令不是提示,而是显示下面报错
Traceback (most recent call last):
File "/usr/lib/command-not-found", line 27, in <module>
from CommandNotFound.util import crash_guard
ModuleNotFoundError: No module named 'CommandNotFound'
正常情况执行一个不存在的命令,会有如下提示:
或
三、网上说法,未能解决
https://blog.csdn.net/qq_33976344/article/details/120113114
sudo vim /usr/lib/cnf-update-db
把
#!/usr/bin/python3
修改成
#!/usr/bin/python3.6
注:ubuntu 18.04 默认安装的是 python3.6 版本。你安装了其他版本,软链接,
修改了 Python3 命令指向新版本,导致输入不存在的命令时,db不能正确使用python3.6版本,搜索数据库里的文件,而报错。
经过修改,也没有成功。而 /usr/bin/python3.6 是这个bin是存在的。
四、分析过程
1.观察时发现 ModuleNotFoundError: No module named 'CommandNotFound' 这么一行错误,意思时找不到'CommandNotFound' 这个模块(这模块名字取的,刚开始误以为是一个提示信息,结果这就是模块名),突然想起 /usr/lib/cnf-update-db 文件里好像导入 CommandNotFound 模块,打开确认一下,果然有。
vim /usr/lib/cnf-update-db
2.那新装的 python 3.8 执行这个报错就知道了,原来是没有 CommandNotFound 这个模块导致。
3.下一步就是看看模块被装到哪里了。一般情况下模块都是装到python 安装目录下的 lib/python3.8/site-packages/目录里。
赶紧搜索一下看看有没有系统自带的 python 3.6 的 site-packages 文件夹,结果没有。
find /usr/ -name "site-packages"
4.那就用另一个方法,加载模块,用 print 打印模块路径。https://www.dandelioncloud.cn/article/details/1616284449148993538
$ python3
Python 3.6.9 (default, Mar 10 2023, 16:46:00)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import os
>>> from CommandNotFound import CommandNotFound
>>> from CommandNotFound.db.creator import DbCreator
>>>
>>> print(CommandNotFound.__file__)
/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py
>>>
找到了模块路径:/usr/lib/python3/dist-packages/CommandNotFound/
不应该是 site-packages 为啥是 dist-packages 目录?区别看链接 https://blog.csdn.net/cc1949/article/details/78286224
5.找到模块就好办了,
把 3.6 的模块,复制或软链接到新装的 3.8 的 site-packages 目录里看看。
cd /usr/local/python3817/lib/python3.8/site-packages
sudo ln -s /usr/lib/python3/dist-packages/CommandNotFound CommandNotFound CommandNotFound
或
sudo cp -r /usr/lib/python3/dist-packages/CommandNotFound /usr/local/python380/lib/python3.8/site-packages/
6.执行一个不存在的命令,
看看有没有正常的提示,又提示 ModuleNotFoundError: No module named '_sqlite3'
这个 'sqlite3' 是数据库。还可以看:https://www.cnblogs.com/wutou/p/17534615.html
ln -s /usr/lib/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so
_sqlite3.cpython-38-x86_64-linux-gnu.so
注意: 一定要把 36m 改成你的版本38 (不要带m)
7.执行一个不存在的命令.看看有没有正常的提示,又
提示 ModuleNotFoundError: No module named 'apt_pkg'
打印一下 python 3.6 老版本的 so 路径
python36 -c 'import apt_pkg;print(apt_pkg.file)'
解决:
cd /usr/local/python380/lib/python3.8/lib-dynload
sudo ln -s /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-38-x86_64-linux-gnu.so
注意: 一定要把 36m 改成你的版本38 (不要带m)
五、解决完成:
这回正常了,从3.6 升级到 3.8 也能正常显示,不存在命令的提示了