在基本 OS(或 Ubuntu)上使用 python 3.8 而不是 3.6

Use python 3.8 instead of 3.6 on elementary OS (or Ubuntu)

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

我通过安装以下软件包手动安装了 python 3.8:python3.8python3.8-devpython3.8-minimalpython3.8-venv。 我还将 link 更新为 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 模块的已编译二进制文件。

所以这个问题已经解决了,但是还有几个类似的问题,其中 none 可以通过这种方式解决,因为模块二进制文件与 python 3.8 不兼容。

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

/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) 吗?

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

一般来说,出于这个原因,您应该单独安装系统 python[3],通常使用 virtual environments。这可以按如下方式完成(假设您在某个项目目录中):

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

第一个命令将在目录 venv 中创建一个虚拟环境 ('venv')。第二个命令将 'activate':现在 python(在这种情况下,python3python3.8)都引用您原来的 python3.8 在此 shell。如果您启动新的 shell.

,则必须重复此操作

这还可以让您 install packages using pip 而不会弄乱您的系统安装。在 Python 开发世界中,使用虚拟环境和 pip 是一种非常普遍的工作流程。

在shell和'global'Python管理方面,您还可以使用pyenv来管理您的Python版本和可用的内容shell。如果你想 运行 python 的特定版本,pyenv 非常好,说 3.8.0 而不是 3.8.1.