Traceback (most recent call last) 解决方法:不用 python3 这个命令,新版本用python38这个命令

发布时间 2023-07-04 17:49:12作者: 悟透

一、报错内容:

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 模块,打开确认一下,果然有。
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 目录里看看。

sudo cp -r /usr/lib/python3/dist-packages/CommandNotFound /usr/local/python380/lib/python3.8/site-packages/

执行一个不存在的命令,看看有没有正常的提示,又提示 ModuleNotFoundError: No module named '_sqlite3'
image

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

image


6.这个 'sqlite3' 是数据库。


抱歉了,因为时间紧,任务重,没有再继续研究。


解决方法:

python3 不用了,直接用 python38 这个命令