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'

正常情况执行一个不存在的命令,会有如下提示:
image

image


三、网上说法,未能解决

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

image


2.那新装的 python 3.8 执行这个报错就知道了,原来是没有 CommandNotFound 这个模块导致。
3.下一步就是看看模块被装到哪里了。一般情况下模块都是装到python 安装目录下的 lib/python3.8/site-packages/目录里。
赶紧搜索一下看看有没有系统自带的 python 3.6 的 site-packages 文件夹,结果没有。

find /usr/ -name "site-packages"

image


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
>>> 

image

找到了模块路径:/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'
image

这个 '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'
image
打印一下 python 3.6 老版本的 so 路径
python36 -c 'import apt_pkg;print(apt_pkg.file)'
image
解决:

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 也能正常显示,不存在命令的提示了
image



posted @ 2023-07-04 17:44  悟透  阅读(17190)  评论(0编辑  收藏  举报