好久没更新了,不好意思~今天受邀写一篇关于如何在CentOS7上配置Python3环境的文章,一般我选择直接扔掉我早年写的一篇源码编译MongoDB的文章,让他们看一下源码编译Python的那一节,其实那一节讲得不是很详细,最近也被很多人催促,所以我还是单独写一篇吧。目前最新的CentOS7.3默认安装Python2,默认官方yum源不提供Python3安装包。有些用户想升级到Python3,但是可能会出现各种问题导致出错。相比之下,激进的Fedora社区在23日将默认版本更改为Python3(如果我没记错的话)。先说一下我使用的系统环境,新建一个Docker容器。使用cat/etc/redhat-release查看您运行的是CentOS7.3。在纯CentOS系统上安装Python环境主要有两种方式。一种是通过源码编译安装,另一种是安装预先打包好的RPM包。根据个人习惯,我们先来看看如何通过源码编译安装Python3.6和配置虚拟环境。使用源码编译安装基础环境。首先安装安装几个必要的包,方便后续操作?yuminstallwgetgccmake?#wget用于下载源码包?#gcc和make用于编译下载Python官网源码包?wgethttps://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz解压、解压缩?xz-dPython-3.6.1.tar.xz?tar-xvfPython-3.6.1.tar编译?cdPython-3.6.1?./configure--prefix=/usr/local/python3.6--enable-optimizations?先解释一下上面的参数,--prefix是预期的安装目录,--enable-optimizations是优化选项(LTO、PGO等)用这个flag编译后,性能会优化10%左右(如果我没记错的话),但这会显着增加编译时间。不过LTO和PGO不在今天文章的讨论范围之内。建议有兴趣的可以看看LTO在GCC中的具体实现。应该不太会写相关的文章了哈哈哈,毕竟写的停不下来。接下来?make?makeinstall如图,会看到报错,提示zlibnotavailable所以,我们需要安装一个依赖?yuminstallzlib-devel那么为什么需要这个依赖包呢,其实是因为Python有一个非常重要的内置模块zipimport,用于从Zip压缩包中导入模块。而如果没有zlib包,那就无法解压,自然也就无法使用这个模块了。我们的依赖安装完成后,重新执行上面的编译安装步骤,发现执行成功了。?/usr/local/python3.6/bin/python3--versionPython3.6.1至此,我们的Python3就安装成功了。检查、编译和安装还不够,让我们做一些检查。当我们运行Python终端,输入importbz2,会发现并没有这个模块。如果您不熟悉这个模块,也没关系。我们输入importsqlite3,熟悉Python的同学对sqlite3应该不会太陌生,但是如果你还不熟悉,那么可以按方向键试试看。你有没有注意到输出变成了^[[D^[[A这样的东西?熟悉Python源码的同学一定知道我要说什么。但如果你不熟悉,没关系,我会告诉你。一般来说,在终端中,我们期望输入上方向键时,会显示上一条命令,左方向键可以用来将光标向左移动。但现实与我们的预期不同,为什么呢?这涉及到输入设备的一点历史原因。简而言之,需要一个模块来转义用户输入。回到本文的重点,我们编译安装的时候少了readline模块。既然问题已经找到,解决方法其实也很简单?yuminstallreadline-devel安装完成后,重复上面的步骤,编译&&安装。再次查看,方向键输入的问题只是解决了,但是我说的两个模块还是无法导入,所以我们仔细看看我们编译过程的输出。有这么一段(根据系统环境,输出可能不一致)Pythonbuildfinishedsuccessful!未找到构建这些可选模块的必要位:_cursesbz2_dbm_gdbm_lzma_sqlite3_tkinterreadline要查找必要位,请查看设置。pyindetect_modules()作为模块的名称。根据上面的提示,很明显我们缺少了一些(可选的)模块。如果您认为您不会使用这些模块,您可以忽略它们。我会更多地使用这些模块,甚至是大多数人不会接触的TK模块哈哈哈。解决方法就是安装相应的模块。?#解决importbz2错误?yuminstallbzip2-devel?#解决importcurses错误?yuminstallncurses-devel?#解决importsqlite3错误?yuminstallsqlite-devel?#解决_dbm_gdbm缺失提醒?yuminstallgdbm-devel?#解决_lzma缺失提醒?yuminstallxz-devel?#解决_tkinter缺失提醒?yuminstalltk-devel?#解决readline缺失提醒和方向键意外行为问题?yuminstallreadline-develwhen这些模块都是安装完成后,重新编译会发现提示消失了,安装即可。使用rpm包安装。首先,让我介绍一下IUS社区。全称是[InlinewithUpstreamStable]加上首字母。它主要是一个提供新版本RPM包的社区。具体用法可以查看官方文档。简单的说,就是按下面的命令来操作。?yum-yinstallhttps://centos7.iuscommunity.org/ius-release.rpm添加IUS后,先创建缓存元数据,然后安装?yummakecache?yuminstallpython36u?yum-yinstallpython36u-pip?之后yum-yinstallpython36u-devel完成,直接在终端输入python3。上面的环境配置只写了Python的安装。如果是rpm安装,直接可用。但是如果是源码编译的话,就不用每次都输入一大串路径了。所以解决方法很简单,加个链接就行了。?ln-s/usr/local/python3.6/bin/python3/usr/bin/python3另外,当系统中存在多个Python版本时,尽量避免环境污染。个人比较推荐使用virtualenv来创建一个独立的虚拟环境,这是我在日常生活中使用的。不过我们安装好Python3.6之后,直接执行下面的命令就可以创建虚拟环境了。?python3-mvenvpy3?sourcepy3/bin/activate(py3)?python-VPython3.6.1总结在CentOS7上安装Python3.6主要有两种方式,源码编译和RPM包安装。对于想快速使用源码配置环境又不想关心具体原因的读者,可以直接使用我GitHub上提供的脚本安装https://raw.githubusercontent.com/tao12345666333/dotfiles/master/env/install_Python36_on_CentOS7.sh另外Python3.6可以直接使用python3-mvenvvenv_name创建虚拟环境。可以通过下方二维码订阅我的文章公众号【MoeLove】
