首页 > 解决方案 > 在基本操作系统(或 Ubuntu)上使用 python 3.8 而不是 3.6

问题描述

我最近开始使用elementary OS。它基于 Ubuntu。在安装过程中,它会安装 python 3.6。

我通过安装以下软件包手动安装了 python 3.8:python3.8, python3.8-dev, python3.8-minimal, python3.8-venv. 我还更新了指向 python 二进制文件的链接:

sudo ln -sf /usr/bin/python3.8 /usr/bin/python3

在此之后,有几件事停止了工作。例如,当我尝试执行一个不存在的命令时,它没有打印找不到该命令的错误消息,但它显示了一个 python 堆栈跟踪。我解决的那个:

cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
sudo ln -s apt_inst.cpython-36m-x86_64-linux-gnu.so apt_inst.so

如您所见,python 错误是因为它找不到 apt 模块的已编译二进制文件。

所以这个问题解决了,但是有几个类似的,没有一个可以这样解决,因为模块二进制文件与 python 3.8 不兼容。

是否可以完全删除 python 3.6 并用 3.8 覆盖它,以便模块二进制文件也得到更新?或者python 3.8和3.6可以共存吗?/usr/bin/python3指向 python 3.6的链接我会很好,我会手动执行/usr/bin/python3.8或为其创建不同的别名或链接。但是,当我打印出sys.pathwith时,/usr/bin/python3.8我得到了这个:

/usr/lib/python38.zip
/usr/lib/python3.8
/usr/lib/python3.8/lib-dynload
/home/{username}/.local/lib/python3.8/site-packages
/usr/local/lib/python3.8/dist-packages
/usr/lib/python3/dist-packages

问题在于最后一个。这就是模块与 3.6 兼容的 so 文件所在的位置。我可以以某种方式强制 python 3.8 完全忽略最后一个模块搜索路径(而不总是在我的脚本中声明 sys.path.remove)吗?

标签: pythonpython-3.xubuntuelementary

解决方案


我建议您撤消覆盖系统范围的 Python 3 版本的符号链接。正如您所发现的,替换python3可执行文件可能会产生一些问题,因为它是在后台使用的。

通常,出于这个原因,您应该不理会系统python[3]安装,并且通常使用虚拟环境。这可以按如下方式完成(假设您在某个项目目录中):

python3.8 -m venv venv
source venv/bin/activate

第一个命令将在目录中创建一个虚拟环境('venv')venv。第二个命令将“激活”:现在python(在这种情况下,python3和)都在此 shell 的上下文中python3.8引用您的原始命令。python3.8如果您启动一个新的 shell,您将不得不重复此操作。

这也将允许您安装软件包,pip而不会弄乱您的系统安装。虚拟环境和 pip 的使用是 Python 开发世界中非常常见的工作流程。

在 shell 和“全局”Python 管理方面,您还可以使用它pyenv来管理您的 Python 版本以及 shell 中可用的内容。pyenv如果你想运行一个特定版本的python,say 3.8.0but not是相当不错的3.8.1


推荐阅读