Python3 源码安装 #13
shenweiyan
announced in
1.3-折腾
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
编程,作为生物信息学的一个基础性技能,是任何一个生信工程师都无法绕开话题。也许有些人还在纠结 Perl 和 Python 到底应该学习哪一个,但作为目前最火最流行的编程语言 Python 还是非常值得尝试的。它不但可以进行文本处理,在统计、网站、游戏、爬虫、数据可视化等方面也有非常强大的应用,比起曾经的 Perl 真的强大和全面很多,且比 Perl 更容易入手。不管从长远发展,还是短期需要,学会 Python,看懂 Perl (或者先学 Python,后学 Perl) 应该是每一个生信工程必备的基础技能之一。
工欲善其事,必先利其器。关于 Python 安装教程在网上一搜一大把,但总感觉不够全面,尤其对于中间出现的一些问题的解决方法不尽如人意。鉴于此,本文基于 CentOS/RHEL Linux 对 Python 的源码编译安装进行了一下简单的总结,记录如下。
安装环境
Red Hat 6.5 + GCC 4.4.7(GCC-7.3.0 - 此版本 gcc 为手动安装)。
GCC 高级版本手动或者
yum安装参考以下文章:解决依赖
如果您拥有 root 权限,请执以下依赖安装:
如果您没有 root 权限,可以参考《手把手教你在 Linux 源码安装最新版本的 R》一文,手动一个个去解决以上的依赖。
_sqlite3
执行 make 过程中提示 _sqlite3 not found,如下:
系统已安装 sqlite3
如果执行 rpm -qa|grep sqlite 看到 sqlite 和 sqlite-devel 都已经安装(libsqlite3.so 默认保存在 /usr/lib64 下;
sqlite3.h默认保存在/usr/include下)。$ sqlite3 -version 3.6.20 $ ll /usr/lib64/libsqlite3.so lrwxrwxrwx 1 root root 19 Apr 23 2015 /usr/lib64/libsqlite3.so -> libsqlite3.so.0.8.6 $ ll /usr/include/sqlite3.h -rw-r--r-- 1 root root 263K Nov 25 2009 /usr/include/sqlite3.h但是,执行
make依然出现以上报错,参考下面的方法《python build from source: cannot build optional module sqlite3 - Stack Overflow》。手动安装 sqlite3
$ wget https://www.sqlite.org/2021/sqlite-autoconf-3360000.tar.gz --no-check-certificate $ tar zvxf sqlite-autoconf-3360000.tar.gz $ cd sqlite-autoconf-3360000 $ ./configure --prefix=/home/shenweiyan/software/sqlite-3.36.0 $ make $ make install配置 sqlite3
对于 3.11.x 以上版本的 Python 可以在
configure指定自定义安装的 sqlite3 路径解决_sqlite3依赖。有些低版本的 Python (如 3.7) 可能需要再源码文件中加入
sqlite3.h的文件路径。_ssl
Python3 需要引用
openssl模块,但是 python3.7+ 在 CentOS 中要求的 openssl 版本最低为 1.0.2,而 CentOS 默认的为 1.0.1(CentOS-6.x 通过yum源安装的 openssl 的最高版本是 1.0.1),所以需要手动更新 openssl。对于 openssl 版本的选择,建议至少选择 1.1.1+ 版本:
请注意:
--with-openssl的自定义路径,依然会导致Could not build the ssl module!报错!yum安装的最高版本的 openssl-1.0.2k 目前发现依然会导致Could not build the ssl module,建议从 https://www.openssl.org/source/old/ 下载 1.1.1 的源码编译安装。最后,在 Python 执行
configure的时候指定 openssl 的相关参数:_tkinter
Tkinter 模块缺失是一个比较棘手的问题,为此专门写了一篇文章来介绍这个问题。
具体请参考:Python 中 tkinter 源码安装使用与中文乱码 - Knowledge-Garden#12
_dbm
_dbm和_gdbm的模块缺失可以通过下面手动的方法解决。最后,增加环境变量,并调整 Python 执行
configure时的参数:_lzma
正常情况下,下面的方法可以解决该问题(如果您有 root 权限的话)。
普通用户可以手动安装解决:
$ wget https://tukaani.org/xz/xz-5.2.5.tar.gz --no-check-certificat $ tar zvxf xz-5.2.5.tar.gz $ cd xz-5.2.5 $ ./configure --prefix=/home/shenweiyan/software/xz-5.2.5 $ make $ make install最后,配置环境:
_ctypes
在 CentOS 6.x 安装
libffi-devel的时候出现以下问题:可以使用下面的方法安装:
手动的源码方法安装如下:
pygraphviz
如果你不需要使用 pygraphviz,可以不用管这个依赖。
参考:《Installation:fatal error: 'graphviz/cgraph.h' file not found》
推荐把安装好的 graphviz 添加到环境变量,这样可以避免运行过程中出现:"pygraphviz/graphviz_wrap.c:2987:29: fatal error: graphviz/cgraph.h: No such file or directory" 无法找到头文件的异常。
如果 graphviz 添加到环境变量,
pygraphviz的 python 包可以参考下面的方法安装:编译安装
这里的编译安装,以 Python-3.11.6 为示例。
第一,下载 Python 源码,解压。
第二,进入解压的源码路径,编译 Python 源码。
--enable-optimizations是优化选项(LTO,PGO 等)加上这个 flag 编译后,性能有 10% 左右的优化,但是这会明显的增加编译时间。建议使用这个参数;--prefix声明安装路径;--enable-shared,指定不同路径即可。当开启--enable-shared时,默认只有一个版本的 python。make过程可能出错。make过程如果出现ModuleNotFoundError: No module named '_ctypes'或者INFO: Could not locate ffi libs and/or headers参考:https://groups.google.com/forum/#!topic/comp.lang.python/npv-wzmytzo--with-openssl=DIR依然无法解决 ssl 模块的问题,可以参考修改 Modules/Setup.dist 文件(默认这块是注释的,放开注释即可。这块功能是开启 SSL 模块,不然会出现安装完毕后,提示找不到 ssl 模块的错误)再执行 configure,修改内容如下:第三,Makefile 生后依次在当前路径执行编译和安装命令。
make && make install第四,安装完成。以上命令执行完毕,且无报错的情况下,我们将默认 python 换将切换至 3.11.6(一般不建议替换,个人建议把自定义安装的 Python bin 路径添加到 PATH 环境变量即可):
运行命令
python -V,查看是否出现 3.11.6 的版本,出现即为安装成功。其他工具
Python >= 3.10 在安装时候,默认会同时安装 pip3!如果你的 python < 3.10,可以参考下面的方法安装 pip。
# 下载 setuptools 和 pip 安装程序 curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python3 get-pip.py至此,CentOS Linux release 6.5 下的 python-3.11.6 全部安装完成。如果在安装过程中出现其他的报错,建议把 error 关键信息直接复制到 Google 进行检索,参考其他人的解决方法。
其他异常与解决
_bz2
在 CentOS 7 中安装 Python-3.6.9 中发现 make 过程中一直提示:"ModuleNotFoundError: No module named '_bz2'",尽管
sudo yum install bzip2 bzip2-devel已经安装了 bzip2 的依赖,问题还是不得其解。最后参考 stackoverflow 上的《Correctly building local python3, with bz2 support》,终于解决问题,下面记录一下。Correctly building local python3, with bz2 support
手动安装 bzip2:
几点说明:
编译安装 Python-3.6.9:
./configure --help中没有--with-openssl参数!有点神奇,我也不知道原因。from _bz2 import BZ2Compressor, BZ2Decompressor测试一下_bz2是否可用。参考资料
Beta Was this translation helpful? Give feedback.
All reactions