但是,该如何展开呢?一定要谨记的一个原则是,在开源项目中做什么事情一定要去找官方文档,一个流行的开源软件,其文档是十分齐全的,这是它流行起来的基础。不同于其它教程,这里并不会直接告诉你如何编译安装python解释器,而是告诉你去找安装它的方法。泡面的包装袋都有如何泡面的说明,那python解释器如何去安装,官方有没有说明呢?我们去官方文档找一找。
还记得python的官方网站吗?进入www.python.org,找到这个位置点击进去就是python的文档了。
其实你也可以记住docs.python.org这个网址,直接进入这个网站,就是python的官网文档页面了。
点击Python Setup and Usage:
我们即将安装的平台是linux系统,所以我们点击Using Python on Unix platforms。
linux和unix是不同的系统,它们非常相像,linux是免费开源的,而unix是收费的。
大部分linux发行版都预置了python,而我们安装好的rocky linux同样如此,你可以在命令行中试一下如下代码:
python -V
# V大写,version的意思
rocky linux预置的python版本是3.6.8的,因此我们想要最新版本的python只能自己编译安装了,我们点击左侧的Building Python来看看自行编译安装python要如何做:
这里告诉我们想要编译python,需要去下载源码,因此,我们先点击source去下载源码。
这里我们选择最新的python3版本,python2已经停止开发维护了。
将页面滑到最下面,我们就可以看到下载链接了。
这里我们看到了源码、mac、windows三种平台的发行包,这里我们选择source release的包。现在我们需要把它下载到linux系统里,准备开始编译安装。
鼠标右键点击"XZ compressed source tarball", 选择复制链接。
回到我们的linux虚拟机中,cd到Downloads目录下,使用wget命令下载python的源码包(把刚刚复制的链接粘贴到wget命令之后):
按下回车键之后就可以等待它下载了。
下载完成之后,使用"ls -l"检查我们下载到的python源码包:
源码包下载好之后,就可以开始安装了,看看官方文档怎么说?
注意页面红框标注的地方,第一个是python编译安装的方法,第二个是python安装时要注意的事项,我们一个一个来解读。
前面我们提到程序经历了机器语言-汇编语言-高级语言这三个阶段,机器只认识1和0的机器语言,而人类难以理解这种语言,所以使用贴近人类语言的高级语言去编写程序。而编译(compile)安装就是将python源代码(人类易读的高级语言)变成机器可以识别的语言(二进制文件),这个过程就是编译。还记得的linux教程中提到过"."表示当前目录吗?./configure正是表示当前目录下的configure文件,这个文件是python源码包中的,待会需要我们解压出来后去执行这些操作。make 和 make install 就是编译安装python,configure就是做一些配置。
但是warning里警告是什么意思呢?由于系统里已经自带python3了,make install会默认安装在系统路径中,这样两个不同版本的Python会起冲突,会造成编译安装的python版本无法正常使用,因此官方文档里建议使用make altinstall代替make install来使两种不同版本的python共存。至于为什么会造成这样的情况,后续的linux系列教程会讲解,这里大家先这样理解。
因此我们将要安装编译的命令是这样的:
./configure
make
make altinstall
这里还有一个情况要注意一下,就是python的开发者设置了默认的编译安装路径,它会将python的各软件文件分散放到各种路径中,这就造成我们后期管理不便,比如我要删除掉某个版本的python,或者管理某个python版本文件。如果它们分散到各处,十分不便,因此我们在configure中配置一下编译安装路径就解决了这个问题。configure还有众多的参数调整,待熟悉python和linux,我们再次尝试理解使用它们,这次先忽略掉。
因此,我们最终的安装编译命令是这样的:
# 命名python3102是因为好方便我们辨别python版本,有时候我们需要在系统上安装不同版本的python以满足需要。
# 而/usr/local大家约定俗成的编译安装的路径,因此我们把编译安装路径设置在这里
./configure --prefix=/usr/local/python3102
make
make altinstall
好了,我们正式开始我们的编译安装工作,首先请确保你已经下载好了python源码包:
# 确认自己的路径在家目录下的下载文件夹内
pwd
# ls -l 查看下载好的源码包的详细信息
ls -l
下载的是个压缩包,因此我们需要去解压它,使用一条命令即可:
# tar在linux是一个万能的压缩解压工具,后续在linux教程中详细讲解相关命令
# tar -xf 加上压缩包就是解压该压缩包,敲一个大写P后按tab键可以自动补齐,一定要熟练使用这个技巧
tar -xf Python-3.10.2.tar.xz
# 再次查看目录内有什么东西
ls -l
图中蓝色的就是我们解压出来的文件夹,cd 进入该目录,使用 ls -l 查看该目录中有什么?
python解释器是C语言开发的,如果你翻看其中的目录,就会发现有.c结尾的文件,那个就是C语言文件。这里我们看到了configure文件,这就是编译配置所需要用到的命令,因此,我们前面总结的编译安装命令此时就可以开始使用了。
首先执行"./configure --prefix=/usr/local/python3102",配置编译后的软件要安装在我们预期的路径。
啊哦,没想到我们配置检查过程中就失败了,注意"configure: error: in..."那两行的错误提示,在计算机中,出现任何error的提示,那基本表示你要做的事情就出现严重错误了。python解释器是C语言开发的,那编译就需要C编译器,但是在我们的系统中不存在,怎么办?
遇事不决,量子力学。呃不对,我们应该找开发者,开发这个东西的人肯定知道!哪里去找?其实开发者们已经在文档里告诉我们了,那我们就去它的文档里找一找该怎么办。
这里告诉我们,在源码包里有README.rst文件描述了Configuration options相关的问题,不过这个文件读起来对我们并不友好,我们可以点击上图红色的链接,在线阅读这个文件。
你打开的链接,就是Python官方开源的地址,你可以在这里看到Python的源代码。但我们目前关不关心这个,需要将python解释器正确地安装在我们的linux系统中,你可以往下滑看到详细的Configuration的相关说明:
"Build Instructions"就是我们要找的东西,点击它查看我们需要的信息。
这里第一段内容告诉我们编译的大致过程,但我们在第一步就卡住了,而第二步则告诉我们编译python需要第三方的库,而我们刚刚执行configure出现的错误告诉我们没有找到C compiler正是它的依赖之一,而如何解决这个问题,我们按照说明点击"Install dependencies"去查看如何解决。
由于我们的系统是rocky linux,它是基于redhat进行发行的,所以我们使用红框中的命令就可以解决编译过程中的依赖问题。
这里解释一下为什么会这样:想象一下,你想自己在家蒸包子,你需要准备面料、肉、菜等材料,因此你可以直接去购买即可。准备齐全之后加工一下便可以做包子了,并不需要自己去种小麦,养家禽,种菜去筹集材料,是不是很方便。而python解释器的开发正是“做包子”一样,开发人员不需要从头到尾完全自己做,别人已经做好的功能,他可以直接拿来引用而不用自己重新做,而他引用别人的功能的包就是依赖。而Python的开发使用了很多别人做好的功能,因此编译时我们也需要把这样功能的安装包安装到系统上。那为什么不自己从头到尾做呢?就像做包子一样,我要面粉还得自己去种小麦,这太划不来了,而且别人已经开发好的成熟的功能,自己在从头做功能并不一定比现成的好,而且费时间精力。
编程世界中这样的事情很常见,比如redhat linux也是使用了开源的kernel和gnu的东西,而我们之后使用python开发自己的小工具,也会使用别人已经做好的东西,这会极大的方便我们去开发自己的东西。
好了,python解释器的configuration中的依赖问题我们总算找到答案了,因此需要在我们的系统中执行下面的命令:
# 还记得吗?yum会安装软件修改系统设置,因此我们需要使用sudo去使用这个管理员命令
sudo yum install yum-utils
# 还需要额外启用PowerTools安装仓库(repository), 这个仓库包含了大部分的开发工具,而python的编译安装正是需要这里面的软件
sudo yum config-manager --enable powertools
# 开始为python安装依赖包
sudo yum-builddep python3
# 如果以上命令长时间没有结束,你可以按住键盘左下角的ctrl+c键可以取消当前命令,然后执行以下命令清除缓存重新执行卡住的命令。
sudo yum clean all
这里我们回答"y"就可以启动安装了,后续都是回答"y"。
然后启用powertools的软件仓库:
没有任何回应说明就成功了,接下来安装Python编译安装所需要的依赖包:
同样回答"y"就可以安装了。
现在我们就可以正常执行configuration的命令了
./configure --prefix=/usr/local/python3102
此时你可以向你的朋友“炫技”,伪装一波高级程序员,没准他会赞叹你。
configuration过程没有任何报错,而且正常结束,说明你的准备工作就没有问题了,这里它提示我们加上"--enable-optimizations"的参数,可以优化编译,所以我们再次调整一下我们的configuration命令:
./configure --prefix=/usr/local/python3102 --enable-optimizations
我们重新执行一下加上"--enable-optimizations"的configuration的命令:
重新执行configuration命令后,没有任何优化提示了,因此我们可以开始编译了,直接在当前目录执行make。
# 启动编译
make
这里提示我们make命令没有找到,询问我们是否安装make这个软件包,这里我们回答y就可以了,后续都是回答y回车。
如果你看到上图中的内容,说明你正式进入编译流程了,这个过程会非常漫长,取决于你电脑性能,只需要耐心等待即可。
终于,漫长的编译结束了:
这时我们就可以将编译好的python文件安装到我们预先设置的"/usr/local/python3102"中了,"/usr/local/"是编译安装软件的惯例路径,就是编程世界的人们都这样做,甚至你如果不使用"--prefix"这个参数,python也会安装到这里来,只不过是按照某些规则分散的放到这里的目录之下,但不便于我们管理使用,所以要自己单独设置一下"--prefix=/usr/local/python3102"。
好了,使用"make altinstall"安装编译好的python吧。
make altinstall
# 为什么不是make install而是使用make altinstall呢?看下图的官方文档的解释。
看"warning"中的解释,相对于我们的情况来说,我们的系统中已经存在3.6的版本,而我们编译安装的是3.10.2的版本,因此他们会起冲突,而使用"make altinstall"会避免这种情况,至于为什么,后续我们在linux系统教程中会有讲解,这里先这样理解。
可是我们执行"make altinstall"时却发生错误退出了,显示"Permission denied"!我们之前提到过,我们当前使用的用户是普通用户,它只能在自己的home目录下及某些公共目录下“搞事情”,而/usr/local并不是公共区域,这里通常会运行着编译安装好的程序,因此普通用户并不能在这里操作。不过好在我们使用的用户在安装系统的时候,被赋予了管理员的权限,因此我们加上sudo并可以使用管理员的权限,把Python安装在这里,因此我们需要运行如下命令:
sudo make altinstall
终于我们完成了安装:
注意上图中两个红色框的内容,其它WARNING可以忽略,它们并不影响我们编译的结果,但是两个红杠中的内容需要引起我们的注意。
第一个红框提示我们"/usr/local/python3102/bin"并不在PATH中,这是什么意思呢?我们使用的cd, mv, yum等等的命令,是在系统的某个固定路径下,我们输入这些命令回车执行时,系统会在这些路径中搜索这些命令去执行,而我们编译安装好的命令并不在这些路径中,需要添加进去,这些概念我们之后会在linux教程中解释,目前先按如下命令执行:
# 向系统中添加我们编译安装好的python下的bin路径
echo "export PATH=\$PATH:/usr/local/python3102/bin" | sudo tee /etc/profile.d/python.sh
# 读取我们配置好的路径
source /etc/profile.d/python.sh
设置好之后我们可以试一下能不能执行我们编译安装好的python文件
在命令行中输入python3之后再连按两下tab键,就会显示出所有版本的python3命令。直接执行python3 -V是系统自带的python版本,而加上版本号之后就是我们编译安装好的python版本,但是这样用太麻烦了,可不可以简单点呢?
这就要提到上面第二个红框中的提示了:
由于我们安装python时使用了sudo,以管理员身份安装的,之后安装python的模块包时,会出现权限问题和冲突问题,因此它建议我们使用virtual environment来解决这个问题。因此我们可以使用如下命令创建一个虚拟的python环境以供我们之后的学习使用:
# cd到我们家目录下的文档目录中, ~表示自己的家目录,就是你登录系统后所处的位置,比如/home/lucas
cd ~/Documents/
# 使用我们编译安的python 3.10.2版本的命令,创建一个叫python3的虚拟环境
python3.10 -m venv python3
# 查看创建好的虚拟环境
ls -l
# 进入创建好的虚拟环境python3当中
cd python3
# 查看有什么内容
ls -l
# 激活这个虚拟环境
source bin/activate
# 检查虚拟环境中的python版本
python3 -V
虚拟环境中你可以直接使用python3这个命令了,它会直接调用我们安装好的Python版本,并不会和系统自带的python版本起冲突。
好了,我们的Python解释器终于安装完成了,并且完成了调试,我们以后就使用这个解释器来继续深入学习研究python。
但是,如果还像以前那样码代码,真的是太难受了。
有没有好一点的方法?程序员们一般会使用一种叫IDE(Integrated Development Environments)的东西,来进行编码,它会自动补齐代码,检查语法错误,语法特殊标记(语法高亮)等种种特性,好方便他们去开发。所以我们也来使用这种IDE来方便我们的学习研究,IDE一般由某种工具提供,这里我们先使用vscode(Visual Studio Code),它是由微软开发并开源的代码编辑器,支持多种编程语言。
使用bing或google搜索vscode,找到它的官方网站。
按下图中的标注的序号1、2选择下载rpm的linux安装包:
复制并执行官方文档中的命令,安装vscode:
在我们的系统中执行以上命令:
安装vscode:
通通回答"y"并按回车键就可以了。
安装完成后打开vscode:
启动后选择你喜欢的UI界面,然后点击Next Section:
继续点击Next Section:
点击Mark Done:
这里我们测试一下python在vscode中编辑的效果,打开一个文件夹:
选择Documents然后点击ok:
选择"yes"
然后在左侧点击新建一个文件,这里可以看到我们刚刚建立的虚拟python3环境:
将新文件命名为test.py:
此时需要我们安装python的拓展支持,点击下面的图标安装(如果这里没有显示Python,可以在上面的搜索栏中搜索Python进行安装):
安装完成后我们回到刚刚新建的test.py文件,试着输入下面的代码:
print('hello world')
自动补齐功能:
输入完成后点击右侧的运行:
看下方的运行效果:
注意一定要使用我们刚刚建立好的虚拟环境:
好了我的在IDE环境也设置好了,接下来的学习就使用这个编辑器学习之后的Python教程。
本次教程较为曲折,为什么不一步到位告诉大家如何编译安装python及设置IDE呢?编程学习十分依赖自学能力,本文提到的步骤有可能会在官方版本更新后失效,这时候再按照本文中的步骤编译安装python就会失败,所以本教程并不会上来就告诉你如何如何做,而是循循善诱,告诉你如何找到操作方法,之后掌握这种学习技巧后,学习任何编程相关的知识都可以手到擒来。
学习python的同时也需要学习linux,之后我们将开发好的python程序部署在系统中,需要懂得linux的相关知识,因此linux也需要同步学习,linux系列教程也会同步更新。
我们下次见~