CentOS 7.4自带的python版本为2.7.5,正常情况下基本满足我们大多数程序对python环境的依赖。但有时候为了使用某些使用python3开发程序(例如:Jumpserver),因为使用python2和python3开发的程序并不兼容的。就必须要在服务器上单独安装python3了。安装使用过程中也踩了一些坑。。这里记录时配置过程!
一、安装Python依赖包
1.1、直接使用yum安装即可
1 |
[root@imzcy ~]# yum -y install gcc zlib-devel openssl-devel epel-release |
二、安装Python
2.1、解压下载的python包,并编译安装
1 2 3 4 |
[root@imzcy ~]# tar xf Python-3.6.1.tar.xz [root@imzcy ~]# cd Python-3.6.1 [root@imzcy Python-3.6.1]# ./configure [root@imzcy Python-3.6.1]# make && make install |
安装完不会修改默认python版本
1 2 3 |
[root@imzcy ~]# python -V Python 2.7.5 [root@imzcy ~]# |
三、开始使用python3.6.1
>>> 一般安装完新版本的python,为了防止系统出现异常,都不会删除旧版的python,而是保持多版本共存。
>>> 如果我们升级python只是为了在新版本环境下执行脚本或程序什么的。可以按以下[3.1]所示步骤配置使用即可。无需修改系统默认python,这样能最好保证不会对系统本身造成影响!
>>> 如果我们升级python是为了被其他外部主机管理调用什么的(例如ansible管理的服务器节点python版本需要2.6及以上),那么只能修改默认的python版本。按如下[3.2]所示配置即可。
3.1、建立 Python 虚拟环境,以后需要在3.6的Python下运行脚本或程序什么都需要执行命令进入虚拟环境再运行
3.1.1 、建立python虚拟环境并进入
1 2 3 4 |
[root@imzcy ~]# cd /opt/ [root@imzcy opt]# python3 -m venv py3 [root@imzcy opt]# source /opt/py3/bin/activate (py3) [root@imzcy opt]# |
3.1.2、查看虚拟环境python版本
1 2 3 |
(py3) [root@imzcy opt]# python -V Python 3.6.1 (py3) [root@imzcy opt]# |
3.1.3、查看虚拟环境pip版本
1 2 3 |
(py3) [root@imzcy ~]# pip -V pip 9.0.1 from /opt/py3/lib/python3.6/site-packages (python 3.6) (py3) [root@imzcy ~]# |
3.1.4、使用pip升级包正常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(py3) [root@imzcy ~]# pip install --upgrade pip Collecting pip Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl (1.3MB) 100% |████████████████████████████████| 1.3MB 388kB/s Installing collected packages: pip Found existing installation: pip 9.0.1 Uninstalling pip-9.0.1: Successfully uninstalled pip-9.0.1 Successfully installed pip-18.1 (py3) [root@imzcy ~]# (py3) [root@imzcy ~]# pip -V pip 18.1 from /opt/py3/lib/python3.6/site-packages/pip (python 3.6) (py3) [root@imzcy ~]# |
3.1.5、使用deactivate命令退出虚拟环境
1 2 |
(py3) [root@imzcy ~]# deactivate [root@imzcy ~]# |
3.1.6、linux下使用shell脚本调用python虚拟环境执行命令
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@imzcy ~]# cat test.sh #!/bin/bash source /opt/py3/bin/activate && python -V && deactivate [root@imzcy ~]# [root@imzcy ~]# python -V Python 2.7.5 [root@imzcy ~]# [root@imzcy ~]# sh test.sh Python 3.6.1 [root@imzcy ~]# |
3.2、修改系统默认python为3.6.1
3.2.1、查找python3安装位置
1 2 3 4 |
[root@imzcy ~]# find / -name python3.6 /usr/local/bin/python3.6 /usr/local/lib/python3.6 [root@imzcy ~]# |
3.2.2、使用 whereis
命令查找python命令位置,可以看到我们正常使用python命令的话,首先调用的是/usr/bin/python这个,但是这个python其实是一个符号链接,指向了当前目录下的python2
1 2 3 |
[root@imzcy ~]# whereis python python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/local/bin/python3.6m /usr/local/bin/python3.6 /usr/local/bin/python3.6m-config /usr/local/bin/python3.6-config /usr/local/lib/python3.6 /usr/include/python2.7 /usr/share/man/man1/python.1.gz [root@imzcy ~]# |
1 2 3 |
[root@imzcy ~]# ll /usr/bin/python lrwxrwxrwx 1 root root 16 10月 17 14:41 /usr/bin/python -> /usr/bin/python2 [root@imzcy ~]# |
3.2.3、我们只需要把那个链接删掉,重新建一个符号链接指向python3就行了
1 2 3 4 5 6 |
[root@imzcy ~]# rm -rf /usr/bin/python [root@imzcy ~]# ln -s /usr/local/bin/python3 /usr/bin/python [root@imzcy ~]# python -V Python 3.6.1 [root@imzcy ~]# |
四、解决centos7.4修改系统默认python版本为3.6.1之后出现的问题
如果按照上面 [3.2] 所示方法直接将系统默认python版本从2.7改为3.6之后,会导致系统中部分由python写的程序无法正常使用。因为本来linux系统中默认python为2.7版本,系统中内置的一些python程序语法模块什么都是按照2.0版本写的。现在直接改了默认python版本为3.6版本的,就会导致python判断系统中要运行的程序语法不正确或者使用的某些模块不存在什么的。。其他不常用的程序可能不出现问题也发现不了。但是最直观的就yum和firewalld不能使用!如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@imzcy ~]# yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxError: invalid syntax [root@imzcy ~]# [root@imzcy ~]# firewalld Traceback (most recent call last): File "/usr/sbin/firewalld", line 29, in <module> import dbus ModuleNotFoundError: No module named 'dbus' [root@imzcy ~]# |
解决方法就是: 修改系统中那些由python写的程序,默认调用的python版本!
4.1、centos7.4修改默认python版本为3.6.1之后YUM不能使用解决方法
4.1.1、查找yum命令所在位置
1 2 3 |
[root@imzcy ~]# whereis yum yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8 [root@imzcy ~]# |
4.1.2、替换yum程序调用的python版本
1 2 |
[root@imzcy ~]# sed -i 's@#!/usr/bin/python@#!/usr/bin/python2@' /usr/bin/yum [root@imzcy ~]# sed -i 's@#! /usr/bin/python@#! /usr/bin/python2@' /usr/libexec/urlgrabber-ext-down |
centos7.4下的yum和RHEL5.8的不一样,不能只修改yum命令的本身,还需要修改上面所示的其调用的urlgrabber-ext-down程序,不然还会报下面这个错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@imzcy ~]# yum list 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirror.premi.st * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax 由于用户取消而退出 [root@imzcy ~]# |
4.2、centos7.4修改默认python版本为3.6.1之后firewalld不能使用解决方法
4.2.1、查找firewalld命令所在位置
1 2 3 |
[root@imzcy ~]# whereis firewalld firewalld: /usr/sbin/firewalld /usr/lib/firewalld /etc/firewalld /usr/share/firewalld /usr/share/man/man1/firewalld.1.gz [root@imzcy ~]# |
4.2.2、修改firewalld程序默认调用的python版本
1 |
[root@imzcy ~]# sed -i 's@#!/usr/bin/python@#!/usr/bin/python2@' /usr/sbin/firewalld |
4.3、其他问题
>>> 然而上面两个只是我们常用的被发现了。。可能系统中还有其他默认使用2.7版本python的程序不能正常工作。
>>> 我们可以等遇到问题的时候再去处理修改。也可以直接在当前系统环境变量中过滤查找修改。
4.3.1、查找当前PATH环境变量中定义的存放命令目录有哪些程序使用了python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@imzcy ~]# for i in `echo $PATH |sed 's/:/ /g'` ; do [ $(ll ${i}/ 2>/dev/null |wc -l) -gt 2 ] && (grep -ai /usr/bin/python ${i}/* |awk -F':' '{printf "%-36s %s\n",$1,$2}') ; done /usr/sbin/authconfig #!/usr/bin/python /usr/sbin/authconfig-tui #!/usr/bin/python /usr/sbin/firewalld #!/usr/bin/python2 -Es /usr/sbin/tuned #!/usr/bin/python -Es /usr/sbin/tuned-adm #!/usr/bin/python -Es /usr/bin/firewall-cmd #!/usr/bin/python -Es /usr/bin/firewall-offline-cmd #!/usr/bin/python -Es /usr/bin/msghack #!/usr/bin/python /usr/bin/pchrt #! /usr/bin/python /usr/bin/pflags #! /usr/bin/python /usr/bin/ptaskset #! /usr/bin/python /usr/bin/pydoc #!/usr/bin/python2.7 /usr/bin/systemd-sysv-convert #!/usr/bin/python /usr/bin/urlgrabber #!/usr/bin/python -t /usr/bin/yum #!/usr/bin/python2 [root@imzcy ~]# |