[Linux]在Ubuntu中如何正确安装python
一、在Ubuntu中python常见的安装方式
在Ubuntu中我们常用的python安装方式有使用包管理工具安装或者使用源码安装,下面我们来讲解一下这两种安装方式的优缺点。首先是使用包管理工具安装,我们可以直接使用“apt install python3.9”来安装一个我们想要的版本的python,这种安装方式就非常的简单,对于新手非常友好,但是缺点也很明显,这种安装方式不能指定安装路径,在安装时环境变量也被一并配置好了,我们自定义的成分太少了,而且使用这种方式安装多个python后可能会造成环境冲突。然后我们来介绍一下使用源码进行安装的安装方式,这种安装方式就相对复杂一些,但是给用户的自定义成分也很高,我们可以自己选择安装路径,自行添加环境变量。在卸载时,我们直接将它安装的目录整个删掉即可,也算是一种比较简单的卸载方式了。这篇文章我们会主要讲解如何使用源码进行安装。下面,就让我们开始吧!
二、python的源码下载
同样的,我们需要去python的官网下载源码,由于本次教程已经不面向纯小白了,所以很多细节可能会被我省略。我们打开python的官网:

如果你没有找到python的官网,可以点击下方的链接进入:
python官网:Welcome to Python.org
进入python的官网以后。我们点击“Downloads”进入python的下载页面。

进入下载界面以后,往下滑找到一个自己想安装的python版本。

点击“Download”进入下载详情页。往下滑,将源码下载下来:

我这里选择的是python3.10.14,后面也都会用这个版本进行演示。
我们这里如果你的Ubuntu是图形化的可以直接在浏览器中下载,如果是无图形化的可能就要使用wget命令来下载了。下面我们演示无图形化的情况,输入下面的命令:
wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz
不同版本的python相关的指令也不同。
下载好以后如图:

可以使用“ls”命令查看文件:

我们使用下面的命令来解压文件:
tar -xvf ./Python-3.10.14.tgz
解压以后得到以下文件夹:

使用下面的命令进入源码文件夹:
cd Python-3.10.14
进入以后可以看到以下文件:
至此,我们的源码已经准备完成,下面就可以开始编译安装了。
三、python的安装
我们使用源码安装python也可以选择指定安装路径和不指定安装路径两种,指定安装路径这个操作要在初始化的时候就要完成。后面,两种情况我都会演示。
在不管是安装python时指定安装路径还是不指定安装路径它们都会有一个过程:“编译”,在编译时需要一些必要的依赖库,如果不安装这些库,在编译时就可能会报错,下面,我们就来安装编译时必要的库。
输入下面的命令更新apt的包列表,这样可以让我们安装的包处于一个比较新的版本。
sudo apt update
在更新完包列表以后,我们使用下面的命令来安装编译时必要的包。
sudo apt install -y build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev libffi-dev
我们可以看到,这里要安装的包非常的多,安装的速度可能会受网络环境的影响。有时候也可能因为网络问题直接安装失败,如果你遇到了这种情况,可以考虑更换网路环境或者使用一些正向代理手段。你也可以考虑一个一个包的安装,这样可以让你看到安装到哪一个包出了问题。发现不能安装的包以后,可以尝试手动安装。
在你安装好上面的包以后,就可以进入下一步了。
1.不指定安装路径安装
我们首先进入刚才下载的源码目录,执行下面的命令:
./configure
这是我们源码目录下的一个预处理文件,用来对我们即将编译的代码进行预处理。也可以通过传入参数的方式来自定义一些功能,比如指定安装路径或者启动优化等。
执行完成以后,如图所示:

在执行完成以后,我们可以观察到,在我们的源代码目录下生成了一个“Makefile”文件,这个文件
是用于指导make如何编译代码的一个脚本文件。在make命令执行以后,它会首先去寻找当前目录的“Makefile”文件。

我们可以打开这个“Makefile”文件看一下。
使用下面的命令可以打开“Makefile”文件。
nano Makefile
我们可以“Makefile”文件中找到许多编译的规则,例如使用的编译器或者是使用的shell脚本路径再或者是安装的路径以及安装后各文件的路径。我们下面主要看安装以后各文件的路径。我们可以通过搜索找到“prefix”:

我们可以看到“prefix”变量的值是“/usr/local”这就表示,它会将python安装到这个路径下,然后我们可以看到“exec_prefix”变量的值是等于“prefix”的值。所以这样我们就可以推断出,我们的可执行文件会被安装在“/usr/local/bin”下,库文件会被安装在“usr/local/lib”下,下面的我们都可以以此类推从而找出python安装的文件夹。我还是比较不推荐不指定路径安装的,因为它会将我们安装的文件每个地方都放一点,不利于管理,并且在卸载时,我们还要去查看“Makefile”文件从而找出python都被安装到了哪个文件夹,需要我们一一去删除。当然,现在你不想使用不指定安装路径的安装方式还来得及,请将整个源码文件夹直接删除并且重新解压,解压后去到下面的指定安装路径的安装方式。
如果你觉得这样的安装方式你还能接受,那我们就继续吧。
在使用“./configure”进行了编译前的预处理以后,我们就可以使用下面的命令开始编译源代码了:
sudo make
如果你被提示“make”找不到之类的,那就可以考虑看看我上面让安装的编译所需的包有没有被正常安装。请一个一个进行检查。
如果你执行了编译指令以后,编译到一半。提示你找不到“xxx.h”文件,也是依赖包的问题。还是请检查安装的依赖包,当你检查完所有所需的包都齐全但程序仍然提示你缺少“xxx”包或者缺少“xxx.h”文件,这很有可能是由于python的新版本导致编译python所需的包与以往不同了。虽然这是极少数情况,但是如果你遇到了,可以根据报错去搜索“xxx”包的安装方法。
在make编译以后,你就可以使用下面的命令来安装编译好的文件了:
sudo make install
这里一定要加“sudo”不然会提示权限问题。执行完这条命令以后,没有报错就表示安装已经成功了,我们可以去到刚才看到的“Makefile”指出的目录下查看文件。在安装完成以后,可以跟着我们下面第四点的教程为这个python添加环境变量。
这个不指定安装路径的方法我在各个方面都讲得很简便,是因为我从一开始就强调了我并不推荐大家特别是小白使用这种方法。如果你并没有使用这种方法安装,我仍然推荐你看下面的指定安装路径的教程。
2.指定安装路径安装
下面我将为大家介绍指定路径安装python的方法,这是我比较推荐的方法,它可以把python安装到一个文件夹中,方便我们管理和卸载。那么,话不多说,让我们开始吧!
我们首先要做的还是先进入我们python的源代码目录:

我们看到源代码目录下的“configure”文件,这是我们编译前的预处理文件,它用于在编译之前对即将编译的代码进行预处理。我们可以通过修改传入这个配置文件的参数来实现一些自定义选项。下面我们就来运行这个预处理文件,并且修改其中的参数来实现指定路径安装,我们可以执行下面的指令:
./configure --prefix=/home/chulingxiao/python3.10.14
这里我们修改了文件的prefix参数,从而实现了修改路径,修改为了“/home/chulingxiao/python3.10.14”目录下。我们按下回车执行命令。如图所示,我们编译前的预处理就已经处理好了。

在执行了上面的命令以后,我们可以发现,我们的源代码目录下生成了一个“Makefile”文件。这个文件是用于指导“make”编译的一个文件,其中包含了使用的编译器以及shell的脚本路径和编译后的安装路径。我们可以打开这个文件看一下。使用下面的命令来打开文件。
nano Makefile
我们可以看到这儿的“prefix”变量中存放的就是我们刚才指定的路径,并且可以推导出后面的“bin”文件夹,“lib”文件夹等都会存放在我们指定的目录下。

在编译前的预处理已经完成以后我们就可以进行正式的编译了。我们可以在源代码目录下输入下面的命令来进行编译:
sudo make
这里一定要加上“sudo”不然可能会被提示权限问题。如果你被提示make命令找不到,请回去检查我一开始就让安装的编译所需的依赖包有没有被正常安装。如果在编译的过程中被提示“xxx”包未安装或者“xxx.h”头文件没有找到,同样的先去检查包是不是已经完全安装了,如果已经安装了我上面所有的包仍然提示有包或者.h文件未找到,那么就需要你自行的去安装一下这些不存在的包了。因为可能会因为python版本的不同,在编译时所依赖的包也不相同,尽管这样的可能性很低,但如果你遇到了还请自行搜索怎么安装这个缺失的包。
在输入命令以后,会经过一段时间,这段时间并不确定,根据自己的硬件和其它因素来决定。
如果你在编译的过程中没有看到红色的错误,并且收到和下图差不多的提示,那么就表示编译是成功的。

在编译成功以后,我们执行安装指令,使用安装指令来安装我们编译好的文件:
sudo make install
这条命令的前面也要加上“sudo”不然也可能提示权限类错误。
看到下面的提示,就表示我们编译好的二进制文件已经成功安装了,但是出现了两条警告,一条是我们没有将这个路径添加到环境变量,另一个警告是不推荐我们使用root的身份去执行pip。都是不重要的警告。

我们现在去到安装的目录验证一下安装的python是否可用。可执行文件在我们安装的目录下的“bin”目录下,我们使用下面的命令进行验证:
cd /home/chulingxiao/python3.10.14/bin/
./python3.10
print('hello')
我们可以看到我们的python具有输出,说明我们的安装是成功的。

四、将python添加到环境变量中
当我们输入一个命令以后,系统会优先从当前路径寻找,然后再去用户变量中寻找,最后会去系统变量中寻找,如果都没找到就会提示没有这个命令或者这个命令没有找到。所以我们在这里配置环境变量我们要将python配置到用户变量中。
我们使用下面的命令打开用户环境变量的配置文件:
nano ~/.bashrc
我们可以去到配置文件的下方,在配置文件中加入一行:
export PATH="/home/chulingxiao/python3.10.14/bin:$PATH"
大家照着复制就行,把这里面的路径替换为自己的python安装路径,不要忘了语句最后的“:$PATH”
在添加完这一行后保存并且退出文件:

我们使用下面的命令来更新环境变量的配置文件:
source ~/.bashrc
更新完环境变量以后,我们在系统中的任何路径下输入“python3.10”就都能找到我们安装的python了。

至此,我们python的环境变量已经配置完成。如果你在配置完环境变量以后仍然被提示找不到命令,那首先去检查环境变量的配置文件,检查配置文件中的路径是否写对,语句是否有缺失,确定配置文件是正确的以后还是不行的话就去查看是否使用命令更新了配置文件。
五、结语
因为这次的教程并不是面向小白的,所以中间我省略了许多细节,但是大致的操作步骤是不会变的,最容易出现错误的地方就在编译的时候,这里需要大家仔细检查所需的包是不是都已经安装完成了。大家在添加环境变量时也要注意不要输错了或者少输一些东西。那我们今天的教程就到此结束了,感谢大家的阅读!
相关文章:
[Linux]在Ubuntu中如何正确安装python
一、在Ubuntu中python常见的安装方式 在Ubuntu中我们常用的python安装方式有使用包管理工具安装或者使用源码安装,下面我们来讲解一下这两种安装方式的优缺点。首先是使用包管理工具安装,我们可以直接使用“apt install python3.9”来安装一个我们想要的…...
[Vue3 + TS + Vite]文件选择器-组件
文件选择器组件代码 <script setup lang"ts"> import { ref, onMounted, defineProps, defineEmits, computed, toRaw } from vue;// 定义props interface Props {buttonTextUnactive?: string;buttonTextActive?: string;onFatherClick?: boolean; }// 定…...
Chrome书签搜索插件
效果展示 这是一个chroma插件,可以按住 ctrl/command B 进行搜索您的书签,并且点击打开您的书签。支持上下切换回车打开新页面。 扩展下载地址 bookmark-search 欢迎有任何问题给我提 issues...
MATLAB算法实战应用案例精讲-【人工智能】联邦学习(二)(附python代码实现)
目录 前言 几个高频面试题目 面向隐私保护的机器学习(PPML)和安全机器学习(Secure ML)的区别: 联邦学习、安全计算是什么关系? 联邦学习有哪些类型?如何区分横向联邦学习和纵向联邦学习? 什么是IID?什么是Non-iid? 联邦学习训练后的模型是一个公共的模型,而…...
在 C++ 中实现一个简单的图形用户界面(GUI)应用
在 C 中实现一个简单的图形用户界面(GUI)应用 图形用户界面(GUI)应用程序是现代软件开发中不可或缺的一部分。它们为用户提供了直观的交互方式,使得操作更加简单和高效。本文将介绍如何在 C 中实现一个简单的 GUI 应用…...
如何编写一个CMakeLists.txt文件(由简到难,较详细)
在Linux系统下,经常使用CMakeLists.txt文件来链接、编译C工程,大部分人clone的代码里都是有CMakeLists.txt文件的,只需要cmake .. 和make就完事了,但在工作中,你必须要有从无到有编写CMakeLists.txt文件的能力。 一、…...
数据结构----链表
一丶概念 链表又称单链表、链式存储结构,用于存储逻辑关系为“一对一”的数据。 和顺序表不同同,使用链表存储数据,不强制要求数据在内存中集中存储,各个元素可以分散存储在内存中。 二丶特点 特点:内存不连续…...
【Qt】内置对话框
一.Qt内置对话框 Qt 提供了多种可复⽤的对话框类型,即 Qt 标准对话框。Qt标准对话框全部继承于QDialog类。常⽤标准对话框如下: 二.内置对话框分类 1.消息对话框 QMessageBox 1.1 概念 消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为…...
excel常规操作
一、去重 IF(COUNTIF($D$1:D2,D2)>1,"",C2) —— D是去重的列 二、不同列匹配 VLOOKUP(A1,E:F,2,0) vlookup(查找值, 查找区域, 返回查找区域的第几列数据, 精确查找输入参数"0"or"false" 或 模糊查找输入参数"1"or"true…...
uniapp webview子页面向父页面发送数据和触发事件,重点在第3条!!!
1、众所周知H5中iframe可以用过postmessage进行,从H5子页面向H5父页面进行通信。方法如下: // 子页面 window.parent.postMessage({ data: 你的消息 }, *);// 父页面 <iframe src"xxxxxxxxxxx"></iframe> window.addEventListene…...
【STM32实物】基于STM32+ESP32+手机APP设计的智能宠物喂食系统实物源码原理图PCB设计文档演示视频——(文末工程资料下载)
基于STM32+ESP32+手机APP设计的智能宠物喂食系统 演示视频 基于STM32+ESP32+手机APP设计的智能宠物喂食系统 摘 要 近年来,宠物在人们生活中越来越不可或缺,给人们带来的陪伴和快乐。然而,由于种种原因,主人不能时刻照顾宠物的饮食,所以宠物喂食装置变得尤为重要。传…...
EMC学习笔记5——辐射骚扰发射
辐射骚扰发射是基本的实验项目,目的是检验设备在工作时有没有产生意外的过强电磁辐射。 例如发电机,在工作时会产生意外的电磁波辐射,因为电子设备中隐藏了一些天线,这些隐藏的天线在辐射电磁波。 一、两种基本的天线结构 如前面…...
深入理解浏览器解析机制和XSS向量编码
基础部分 1.<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a> <a>标签可以识别,但是解析不了, 是在协议的编码顺序上,先认协议 URL 编码 "javascript:alert(1)" 2.<a …...
winform 大头针实现方法——把窗口钉在最上层
平时我们再使用成熟的软件的时候,会发现有个大头针的功能挺不错的。就是点一下大头针,窗口就会钉住,一直保持在最上面一层,这样可以一边设置参数,一边观察这个窗口里面的变化,比较方便。下面我就来简单实现…...
中间件|day1.Redis
Redis 定义 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hash…...
PMP到底有什么用?
PMP 就是项目管理证书,全称是项目管理专业人士资格认证,对于一个在项目管理岗位混迹五年的老油条来说,PMP 证书是敲开项目管理岗位的第一块砖,每年考 PMP 的人都很多,要是 PMP 证书没有价值,还会有那么多人…...
apache huidi 时间旅行Time Travel)机制
Apache Hudi(Hadoop Upserts Deletes and Incrementals)是一个数据管理框架,它帮助你高效地管理存储在分布式存储系统(如HDFS或云存储)上的大型数据集。其一个关键特性是“时间旅行”,这允许你在特定时间点查询数据的历史版本。 什么是Apache Hudi中的时间旅行? Apach…...
Python 数据可视化,怎么选出合适数据的图表
数据可视化最佳实践 1. 引言:为什么数据可视化最佳实践很重要 数据可视化是数据分析和决策过程中不可或缺的一部分。通过有效的可视化,复杂的数据可以转化为易于理解的信息,从而帮助观众快速做出正确的判断。然而,糟糕的可视化可…...
c# 元组
文章目录 元组的定义元组的使用示例使用场景创建一个列表 在 C# 中,元组(Tuple)是一种用于存储多个值的数据结构,它可以方便地将不同类型的多个值打包在一起。元组在 C# 7.0 及更高版本中得到了增强,允许更方便地创建和…...
自定义注解
目录 使用注解定义分布式锁 Aop例子 retention 表示在什么时候可以用,runtime表示在运行期可以用 target表示可以用在哪些上面 inherited表示可以被继承 切点和切面类 重点是 pjp.proceed(args) 这个就是执行目标方法,下面的这一段没啥意思 也可…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)
LSTM-XGBoost多变量时序预测(Matlab完整源码和数据) 目录 LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的多变量时序已经用腻了,审稿人也看烦了&#…...
