记一次在CentOS系统搭建python3环境
首先,查看linux系统类型和版本:参考:查看linux系统类型和版本
默认Centos7中是有python安装的,但是是2.7版本,实际上这几个文件之间是有依赖关系的。在ls 后面加个 -al参数,如下:
[root@localhost bin]# cd /usr/bin
[root@localhost bin]# ls -al python*
lrwxrwxrwx. 1 root root 33 Oct 21 12:30 python -> python2
lrwxrwxrwx. 1 root root 9 Oct 19 23:55 python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 Aug 4 08:40 python2.7
[root@localhost bin]#
备份第一个python,使用如下命令:
[root@localhost bin]# mv python python.bak
[root@localhost bin]# mkdir /usr/local/python3
目录创建好了,我们就cd切换进去就好了。
[root@localhost bin]# cd /usr/local/python3
接下来我们要下载python把源码下载到这个目录下就OK,命令如下:
[root@localhost python3]# wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
等待下载完成之后会在当前目录下出现一个tgz包,命令解压这个包到当前目录就可以:
#解压命令
[root@localhost python3]# tar -xvf Python-3.6.6.tgz
#解压完成后,查看目录下文件
[root@localhost python3]# ll
drwxr-xr-x. 17 501 501 4096 Oct 21 12:22 Python-3.6.6
-rw-r--r--. 1 root root 22673115 Oct 3 15:47 Python-3.6.6.tgz
就要开始安装了,因为下载的包是未编译的,我们需要编译一下。
进入文件目录:
[root@localhost python3]# cd Python-3.6.3/
[root@localhost Python-3.6.3]#
把python的安装目录指定一下,这样的话,里面的一些bin目录、lib目录就都会存放在这个目录下面。如果不指定这个安装目录的话,最后python的安装文件将分散到linux的默认目录,不在一块。我们指定安装目录,以后卸载的话直接删除目录就可以干净卸载了。
如下命令:
[root@localhost Python-3.6.3]# ./configure --prefix=/usr/local/python3Dir
现在我们当前目录还是在/usr/local/python3/Python-3.6.3,执行如下命令:
[root@localhost Python-3.6.3]# make
然后出来一大堆代码,等它执行完毕。接着输入以下命令:
[root@localhost Python-3.6.3]# make install
又是一大堆代码,执行完毕之后,我们就可以切换到/usr/local/python3Dir目录下去查看了。
[root@localhost Python-3.6.3]# cd /usr/local/python3Dir/
[root@localhost python3Dir]# ll
total 0
drwxr-xr-x. 2 root root 245 Oct 21 12:26 bin
drwxr-xr-x. 3 root root 24 Oct 21 12:26 include
drwxr-xr-x. 4 root root 63 Oct 21 12:26 lib
drwxr-xr-x. 3 root root 17 Oct 21 12:26 share
[root@localhost python3Dir]#
接下来我们还有一点善后工作。切换到 /usr/bin目录下面吧:
[root@localhost python3Dir]# cd /usr/bin
#然后输入以下命令 ,创建一个软链接
[root@localhost bin]# ln -s /usr/local/python3Dir/bin/python3 /usr/bin/python
1、在执行yum命令时忽然发现出现以下报错:
# yum list
File
"/usr/bin/yum"
, line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax
原因:
这是因为yum采用Python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 7自带的yum采用的是python2.7,当系统将python升级到3后,出现语法解释错误。
解决办法:
一是升级yum。
二是修改yum的解释器为旧版本python2.7,即将连接文件/usr/bin/python连接回/usr/bin/python2.7。治标不治本,不推荐。
三是在设置里更改解释器设置,即修改/usr/bin/yum文件,指定使用python2.7作为yum的解释器:
# vi /usr/bin/yum
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可。
安装软件时又会出现另一种报错
Downloading packages:
File
"/usr/libexec/urlgrabber-ext-down"
, line 28
except OSError, e:
^
SyntaxError: invalid syntax
# vi /usr/libexec/urlgrabber-ext-down
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可。
我们查看一下链接情况:
[root@localhost bin]# ll -a python*
lrwxrwxrwx. 1 root root 33 Oct 21 12:30 python -> /usr/local/python3Dir/bin/python3
lrwxrwxrwx. 1 root root 9 Oct 19 23:55 python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 Aug 4 08:40 python2.7
lrwxrwxrwx. 1 root root 7 Oct 19 23:55 python.bak -> python2
[root@localhost bin]#
然后查看一下当前的python版本
[root@localhost bin]# python -V
Python 3.6.6
[root@localhost bin]#
然后来个hello world测试一下:
先输入python进入,然后写代码:
[root@localhost bin]# python
Python 3.6.3 (default, Oct 21 2017, 12:21:40)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World")
Hello World
>>> exit()
[root@localhost bin]#
python安装完成,但是有点小问题,发现python命令行无法使用退格键、方向键。
需要安装Python 中的 readline模块
pip install readline
此处pip属于python2的,需要安装并升级python3的pip
安装pip以及setuptools
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
tar -zxvf setuptools-19.6.tar.gz
cd setuptools-19.6
python3 setup.py build
python3 setup.py install
报错:RuntimeError: Compression requires the (missing) zlib module
我们需要在linux中安装zlib-devel包,进行支持。
yum install zlib-devel
需要对python3.6进行重新编译安装。
cd /usr/local/python3/Python-3.6.6
make & make install
重新安装setuptools
python3 setup.py build
python3 setup.py install
2、安装pip
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
tar -zxvf pip-8.0.2.tar.gz
cd pip-8.0.2
python3 setup.py build
python3 setup.py install
如果没有意外的话,pip安装完成。
测试:
ImportError: cannot import name 'HTTPSHandler'
是缺少openssl的开发环境,我们继续安装
yum install openssl-devel
继续重新编译安装python3.6、setuptools和pip
[root@VM_71_251_centos python3Dir]# cd /usr/bin/
[root@VM_71_251_centos bin]# ls -la pip*
-rwxr-xr-x 1 root root 215 Nov 29 13:51 pip
-rwxr-xr-x 1 root root 215 Nov 29 13:51 pip2
-rwxr-xr-x 1 root root 215 Nov 29 13:51 pip2.7
[root@VM_71_251_centos bin]# cp pip pip3
[root@VM_71_251_centos bin]# vi pip3
#!/usr/bin/python2改成#!/usr/bin/python3
from pip._internal import main改成from pip import main(版本号为8.0.2的时候需要)
[root@VM_71_251_centos bin]# pip -V
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
[root@VM_71_251_centos bin]# pip3 -V
pip 8.0.2 from /usr/local/python3Dir/lib/python3.6/site-packages/pip-8.0.2-py3.6.egg (python 3.6)
升级pip:pip3 install --upgrade pip
[root@VM_71_251_centos bin]# pip3 -V
pip 18.1 from /usr/local/python3Dir/lib/python3.6/site-packages/pip (python 3.6)
再来安装readline模块
python3 -m pip install readline
又有新的错误:
发现错误:cannot find -lncurses那就去安装ncurses:yum install ncurses-devel
安装ncurses完成后,再来安装readline:
然后测试一下python3的命令行无法使用退格键、方向键的问题,
经测试,可以使用退格键和方向键了,但是回车就异常了,如下所示:
*** Error in `python3': munmap_chunk(): invalid pointer: 0x00007f848cee20a0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7f5e4)[0x7f848c0a15e4]
python3(PyOS_Readline+0xec)[0x5cc48c]
python3[0x4473e0]
python3[0x448d28]
python3(PyTokenizer_Get+0x9)[0x449b69]
python3[0x44596d]
python3(PyParser_ASTFromFileObject+0x89)[0x427909]
python3[0x427b1b]
python3(PyRun_InteractiveLoopFlags+0x76)[0x427e46]
python3(PyRun_AnyFileExFlags+0x3c)[0x427fcc]
python3(Py_Main+0xc44)[0x43baa4]
python3(main+0x162)[0x41d8b2]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f848c044445]
python3[0x41d970]
======= Memory map: ========
00400000-00670000 r-xp 00000000 fd:01 539422 /usr/local/python3Dir/bin/python3.6
0086f000-00870000 r--p 0026f000 fd:01 539422 /usr/local/python3Dir/bin/python3.6
00870000-008d4000 rw-p 00270000 fd:01 539422 /usr/local/python3Dir/bin/python3.6
008d4000-00905000 rw-p 00000000 00:00 0
01b0a000-01bd4000 rw-p 00000000 00:00 0 [heap]
7f848524c000-7f8485261000 r-xp 00000000 fd:01 287503 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f8485261000-7f8485460000 ---p 00015000 fd:01 287503 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f8485460000-7f8485461000 r--p 00014000 fd:01 287503 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f8485461000-7f8485462000 rw-p 00015000 fd:01 287503 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f8485462000-7f8485487000 r-xp 00000000 fd:01 265991 /usr/lib64/libtinfo.so.5.9
7f8485487000-7f8485687000 ---p 00025000 fd:01 265991 /usr/lib64/libtinfo.so.5.9
7f8485687000-7f848568b000 r--p 00025000 fd:01 265991 /usr/lib64/libtinfo.so.5.9
7f848568b000-7f848568c000 rw-p 00029000 fd:01 265991 /usr/lib64/libtinfo.so.5.9
7f848568c000-7f84856b2000 r-xp 00000000 fd:01 265981 /usr/lib64/libncurses.so.5.9
7f84856b2000-7f84858b1000 ---p 00026000 fd:01 265981 /usr/lib64/libncurses.so.5.9
7f84858b1000-7f84858b2000 r--p 00025000 fd:01 265981 /usr/lib64/libncurses.so.5.9
7f84858b2000-7f84858b3000 rw-p 00026000 fd:01 265981 /usr/lib64/libncurses.so.5.9
查原因:
readline (6.2.4.1) :
The standard Python readline extension statically linked against the GNU readline library.
标准Python的readline扩展静态链接反对GNU readline库。
pip3 uninstall readline
pip3 install gnureadlin
参考:http://www.bubuko.com/infodetail-2766506.html
readline模块终于安装成功了,然后测试一下python3的命令行无法使用退格键、方向键的问题,
经测试,可以使用退格键和方向键了,回车也没有异常了
ok,我们终于完成了整个python3环境的安装。