记一次在CentOS系统搭建python3环境

时间:2021-11-10 10:02:13

  首先,查看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
  在Centos 7上创建一个目录吧。一般选择的是/usr/local里面的,如下命令:
[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目录下去查看了。

记一次在CentOS系统搭建python3环境
[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]#
记一次在CentOS系统搭建python3环境

接下来我们还有一点善后工作。切换到 /usr/bin目录下面吧:

[root@localhost python3Dir]# cd /usr/bin
#然后输入以下命令 ,创建一个软链接
[root@localhost bin]# ln -s /usr/local/python3Dir/bin/python3 /usr/bin/python

因为yum依赖原来的python,所以这样修改后yum命令会出问题

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进入,然后写代码:

记一次在CentOS系统搭建python3环境
[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]#
记一次在CentOS系统搭建python3环境

python安装完成,但是有点小问题,发现python命令行无法使用退格键、方向键。

需要安装Python 中的 readline模块

pip install readline

记一次在CentOS系统搭建python3环境

此处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安装完成。

测试:

记一次在CentOS系统搭建python3环境

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

又有新的错误:

记一次在CentOS系统搭建python3环境

发现错误:cannot find -lncurses

那就去安装ncurses:yum install ncurses-devel

安装ncurses完成后,再来安装readline:

记一次在CentOS系统搭建python3环境

然后测试一下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环境的安装。