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
-
编程,作为生物信息学的一个基础性技能,是任何一个生信工程师都无法绕开话题。也许有些人还在纠结 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=/Bioinfo/Pipeline/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=/Bioinfo/Pipeline/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