在Linux上使用包管理软件安装python是最稳妥的方式,但有时为了获取软件的最新版本,也经常会用源码编译安装。步骤并不复杂,但是有些细节很容易出错。十分不建议新手编译安装,用包管理软件就可以很方便的安装使用。我就是刚学时被编译安装坑了,后面不断的填当初编译时埋下的坑。
1、下载python源码
用wget从官网下载源码,选择任意版本python3,我选的当时最新的发行版python3.6.4,其中安装包版本Gzipped source tarball即我们所需的源码。
$ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
2、解压,配置
下载完成后解压,然后添加配置。在configure的选项中,--prefix定义了安装位置,便于以后更新或删除python;--enable-shared指定安装共享库,共享库在使用其他需调用python的软件时会用到,比如使用mod_wgsi连接Apache与python时需要,最好填上。
$ tar -xzvf Python-3.6.4.tgz
$ cd Python-3.6.4
$ ./configure --prefix=/usr/local/python3 --enable-shared
$ sudo mkdir /usr/local/python3
3、编译,安装
然后make编译,建议在此之前先用yum deplist python36查看是否缺少某些依赖。编译时间很长,耐心等待,在这一步结束后一定要仔细查看打印的结果,看看是否有错误。如果安装环境中依赖不全,很容易产生错误,而且有的错误并不影响后续安装,甚至python可以“正常”运行,往往等你要用到某些模块时才发现找不到该模块。
完成后安装。
$ make
$ sudo make install
4、建立软链
然后建立python3和pip3的软链。
$ ln -s /usr/local/python3/bin/python3 /usr/bin/python3
$ ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
建立软链后输入python3即可进入python3解释器,同时你还可以输入python或python2进入python2解释器,二者可以共存。
注意!有的网上教程可能会让你更改软链python连接到python3,这样做的好处仅仅是在打开python解释器时可以直接用python指令,但是这样做的代价则是其他依赖python2的程序可能会因此崩溃。除非你知道自己在做什么,否则不要动原来的python软链,使用python3指令进入解释器比较安全。
5、常见bug
——没有pip
如果安装完后发现pip不能用,很可能是没有安装相应的依赖,碰到这个问题可以参考这篇回答——centos在python3环境下安装PIP的问题?,这里就不赘述了。
——无法导入ssl模块
该模块在涉及到网络的编程中经常会用,我在安装requests时遇到过这个问题。该bug是因为编译python时没有成功安装ssl模块,往往是没有安装openssl导致的。
解决办法很简单,先安装openssl:
yum install openssl openssl-devel
然后重新编译pyhon即可。
make
make install
若是依然导入不了ssl模块,试试修改Setup文件后在编译安装一次。
vim Modules/Setup
修改如下:
# Socket module helper for socket(2)
_socket socketmodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
# SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
——Python Shell 中敲击方向键显示「^[[C^[[D」
不过该解决方案有点过时,readline包已被弃用,现在改名为gnureadline了,安装该包即可修复方向键的bug。
pip3 install gnureadline
——无法导入sqlite3模块
没想到安装完python3很久以后,又碰上了依赖问题。这次真心不想再编译一遍了,所以就另辟蹊径。
先确保安装了sqlite的开发包,然后用yum下载一个版本相近的python
sudo yum install sqlite-devel
sudo yum install python36
然后找到缺少的库文件存放的位置,复制到原来的python的文件夹中,建议一次性把其他缺少的库文件也复制过来,
sudo cp /usr/lib64/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so /usr/local/python3/lib/python3.6/lib-dynload
然后删掉新装的python,恢复软链,然后测试能否导入sqlite3。
sudo yum remove python36
sudo ln -s /usr/local/python3/bin/python3 /bin
sudo ln -s /usr/local/python3/bin/pip3 /bin
sudo ln -s /usr/local/python3/lib/libpython3.6m.so.1.0 /lib64
虽然也很麻烦,但是速度比重新编译一次python快多了,现在才终于发现yum安装真的又快又好。
T-T
新手绝对不要自己编译python,真的后患无穷。不仅仅只是当前填坑很烦,很久以前埋下的坑时不时会出来捣乱,总不能每次都重新编译一遍吧。我真想再用yum安装一边python,但之前编译的python已经装了不少第三方库,有的库也是安装的时候各种坑,实在是不想去一个个重装。哎,都是泪啊。