python - 在基本操作系统(或 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.path
with时,/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)吗?
解决方案
我建议您撤消覆盖系统范围的 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.0
but not是相当不错的3.8.1
。
推荐阅读
- powershell - Powershell Get values listed
- rest - How to Kill a Spark Application using Yarn ResourceManager REST API
- html - 用元素填充页面以打印到边距
- php - 从数组创建组合 - Laravel Collect(crossJoin) 方法
- amazon-web-services - aws lambda 调用将多个文件从一个存储桶放到另一个存储桶?
- .net-core - .Net Core Npgsql 准备好的语句
- c - 使用 realloc() 从分配段的开头删除数据?
- pdfbox - 我在哪里可以下载 PDFBox 2.xx 的 .NET 版本和匹配的 IKVM 二进制文件
- c++ - MFC-设置图片为背景图片
- javascript - 如何将维度值分为 3 个不同的类别?