CentOS7下编译Python3.7
安装相关包
# 查看目前的python在系统的位置
[root@localhost ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
# 转到python所在目录
[root@localhost ~]# cd /usr/bin
[root@localhost bin]# ll python*
lrwxrwxrwx. 1 root root 7 Jan 12 00:27 python -> python2
lrwxrwxrwx. 1 root root 9 Jan 12 00:27 python2 -> python2.7
-rwxr-xr-x. 1 root root 7216 Apr 11 2018 python2.7
# 安装相关包
[root@localhost bin]# yum install zlib-devel bzip2-devel openssl-devel nvurses-devel sqlite-devel readline-devel tk-devel gcc make
下载编译python的源码包
[root@localhost bin]# wget https://python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
# 解压
[root@localhost bin]# xz -d Python-3.7.2.tar.xz
[root@localhost bin]# tar -xf Python-3.7.2.tar
# 进入解压后的目录,然后安装
[root@localhost bin]# cd Python-3.7.2
[root@localhost Python-3.7.2]# ./configure prefix=/usr/local/python3
[root@localhost Python-3.7.2]# make && make install
添加软链接
# 备份原来的链接
[root@localhost Python-3.7.2]# mv /usr/bin/python /usr/bin/python.bak
# 添加python3的软链接
[root@localhost Python-3.7.2]# ln -s /usr/local/python3/bin/python3.7 /usr/bin/python
如果出现报错”ln: failed to create symbolic link '/usr/bin/python': File exists“,说明已经存在链接,删除原链接重新链接即可,删除命令[root@localhost Python-3.7.2]# rm -rf /usr/bin/python,
[root@localhost Python-3.7.2]# ln -s /usr/local/python3/bin/python3.7 /usr/bin/python
# 测试安装是否成功
[root@localhost Python-3.7.2]# python -V
Python 3.7.2
# 添加pip的软链接
[root@localhost Python-3.7.2]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
[root@localhost Python-3.7.2]# pip -V
pip 18.1 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)
更改yum设置
因为要用python2才能执行,否则无法使用yum
[root@localhost Python-3.7.2]# vim /usr/bin/yum
然后按[e]==>[i] 把#! /usr/bin/python修改为#! /usr/bin/python2,再按[Esc],输入":wq"保存退出
[root@localhost Python-3.7.2]# vim /usr/libexec/urlgrabber-ext-down
然后按[e]==>[i] 把#! /usr/bin/python修改为#! /usr/bin/python2,再按[Esc],输入":wq"保存退出
在编译过程中出现的问题及解决方法
问题:
在安装相关包时,输入yum install zlib-devel bzip2-devel openssl-devel nvurses-devel sqlite-devel readline-devel tk-devel gcc make,会出现Cannot find a valid baseurl for repo: base/7/x86_64的错误
解决方法:
在查阅资料之后发现是没有联网,具体联网方式如下:
-
第一步: 登录已装好的CentOS7虚拟机。以root管理员身份登录系统。在终端下输入双引号内的内容“ls /etc/sysconfig/network-scripts” ,之后按回车键。 此时,会出现一张文件列表,记下ifcfg-ensXXXX。
-
第二步:在终端输入vi /etc/sysconfig/network-scripts/ifcfg-ensXXXX(XXXX替换为自己的数值), 此时进入ifcfg-ensXXXX这个网络配置文件的阅读模式,接着按i键,即insert,进入文本插入编辑模式。重点设置BOOTPROTO=dhcp,ONBOOT=yes即可。 修改完之后,先按Esc键,再按:键,然后输入wq,最后按回车键方可退出vim编辑器 。
-
第三步:在主机下,按win+R键,调出win7运行栏。接着在运行栏中输入services.msc,打开windows服务。如下图所示,找到VMware DHCP Service和VMware NAT Service 确保它们都已启用!!
-
第四步:在虚拟机终端下输入service network restart即可上网。
问题
在进入解压后的目录,然后安装时,输入make && make install会报错,ModuleNotFoundError: No module named ‘_ctypes’,这是因为3.7版本需要一个新的包libffi-devel,把这个包安装即可。
解决方法:
[root@localhost Python-3.7.2]# yum install libffi-devel -y
[root@localhost Python-3.7.2]# make install
即可。
python3中有个内置模块叫ctypes,它是python3的外部函数库模块,提供了兼容C语言的数据类型,并通过它调用Linux系统下的共享库(Shared library),此模块需要使用centos7系统中外部函数库(Foreign function library)的开发链接库(头文件和链接库)。
由于在centos7系统中没有安装外部函数库(libffi)的开发链接库软件包,所以在安装pip的时候就报了"ModuleNotFoundError: No module named ‘_ctypes’"的错误。