Python3以后,使用源码编译python时默认不会包含ssl,tkinter等库,这意味着在调用"import _ssl"或者"import _tkinter"时会出现错误。本文以python3.6.6编译过程为例,将逐步记录解决这些问题中所踩的坑。
1. openssl
1.1 下载源码包openssl-1.1.1-pre9.tar.gz
1.2 解压进入目录并进行编译安装
tar -xzf openssl-1.1.1-pre9.tar.gz
cd openssl-1.1.1-pre9
./Configure --prefix=/user/xxx/3rd/openssl/ #自定义安装路径
make && make install
1.3 安装完成后在指定的安装目录下会生成openssl对应的库和头文件
1.4 修改python源码目录下的Modules/Setup文件,找到下面的内容,取消指定ssl的库和头文件的代码行,并修改成自己的ssl库所在路径
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/user/xxx/3rd/openssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
1.5 修改完毕保存后重新编译python即可。
1.6 测试
python -c "import _ssl"
2. tkinter
tkinte的依赖包比较多,我在这里花费了较长时间,主要参考了这片文章
2.1 ActivateTcl
2.1.1 在官网https://www.activestate.com/products/activetcl/downloads/下载 activateTcl,这里我下载的版本是ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5
2.1.2 解压进入目录并进行编译安装
tar -xzf ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5.tar.gz
cd ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5-28eabcbe7
./Configure --prefix=/user/xxx/3rd/ActiveTcl #自定义安装路径
make && make install
2.1.3 安装完成后在指定的安装目录下会生成ActiveTcl对应的库和头文件
2.2 X11
2.2.1 在网站http://sources.endlessm.com/debian/pool/core/libx/libx11/下载libx11_1.6.2.orig.tar.gz
2.2.2 x11需要依赖很多包,主要包括xproto、xextproto、xcb、xtrans、inputproto、kbproto,其中xcb又依赖xcb-proto、xau和pthread-stubs,这些依赖包都可以在官网https://www.x.org/releases/X11R7.7/src/everything/找到并下载。
2.2.3 先按照依赖顺序依次安装这些包,安装过程就是经典的三部曲:
./configure && make && make install
2.2.4 安装完成后,在指定目录下会生成对应的pkgconfig目录,建议将上述包的目录都写入PKG_CONFIG_PATH环境变量中:
export PKG_CONFIG_PATH=/user/xxx/3rd/xproto/lib/pkgconfig/:/user/xxx/3rd/xextproto/lib/pkgconfig/:/user/xxx/3rd/xtrans/share/pkgconfig/:/user/xxx/3rd/kbproto/lib/pkgconfig/:/user/xxx/3rd/inputproto/lib/pkgconfig/:/user/xxx/3rd/xcb-proto/lib/pkgconfig/:/user/xxx/3rd/pthread-stubs/lib/pkgconfig/:/user/xxx/3rd/xau/lib/pkgconfig/:/user/xxx/3rd/xcb/lib/pkgconfig/:$PKG_CONFIG_PATH
2.2.5 上述安装包安装完毕后,最后安装X11
2.2.6 安装 ibXScrnSaver-1.2.2-6.1.el7.x86_64.rpm
rpm -ivh ibXScrnSaver-1.2.2-6.1.el7.x86_64.rpm
安装完成后在/usr/lib64下会生成libXss.so.1,将/usr/lib64写入环境变量LD_LIBRARY_PATH中。
2.2.7上述准备工作完成后,可以配置编译python了。在Modules/Setup文件中找到如下内容并根据自身情况进行修改
# *** Always uncomment this (leave the leading underscore in!):
_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
# *** Uncomment and edit to reflect where your Tcl/Tk libraries are:
-L/user/xxx/3rd/ActiveTcl-8.6/lib \ #取消注释
# *** Uncomment and edit to reflect where your Tcl/Tk headers are:
-I/user/xxx/3rd/ActiveTcl-8.6/include \ #取消注释
# *** Uncomment and edit to reflect where your X11 header files are:
-I/user/xxx/3rd/X11/include \ #取消注释
-I/user/xxx/3rd/xproto/include \ #添加一行,否则找不到X11/X.h
# *** Or uncomment this for Solaris:
# -I/usr/openwin/include \
# *** Uncomment and edit for Tix extension only:
# -DWITH_TIX -ltix8.1.8.2 \
# *** Uncomment and edit for BLT extension only:
# -DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \
# *** Uncomment and edit for PIL (TkImaging) extension only:
# (See http://www.pythonware.com/products/pil/ for more info)
# -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
# *** Uncomment and edit for TOGL extension only:
# -DWITH_TOGL togl.c \
# *** Uncomment and edit to reflect your Tcl/Tk versions:
-ltk8.6 -ltcl8.6 \ #取消注释 根据下载的库版本填写
# *** Uncomment and edit to reflect where your X11 libraries are:
-L/data1/qspace/morajiang/3rdparty/X11/lib \
# *** Or uncomment this for Solaris:
# -L/usr/openwin/lib \
# *** Uncomment these for TOGL extension only:
# -lGL -lGLU -lXext -lXmu \
# *** Uncomment for AIX:
# -lld \
# *** Always uncomment this; X11 libraries to link with:
-lX11 #取消注释
2.2.8 重新配置并编译
./configure --prefix=/user/xxx/python --with-tcltk-includes='-I/user/xxx/3rd/ActiveTcl-8.6/include' --with-tcltk-libs='/xxx/user/3rd/ActiveTcl-8.6/lib/libtcl8.6.so /user/xxx/3rd/ActiveTcl-8.6/lib/libtk8.6.so' --enable-optimizations
make -j8
make altinstall
2.2.9 测试
python -c "import _tkinter"
3. bz2
3.1 下载bzip2-1.0.6.tar.gz
3.2 编译安装生成动态和静态库,并将生成的libbz2.so.1.0所在的目录添加到环境变量LD_LIBRARY_PATH
make -f Makefile-libbz2_so
make && make install PREFIX=xxx
3.2 下载编译好的含有bz2的so文件
https://pan.baidu.com/s/1fHhxNiHOLKDqZ-9wHw3JTA 3.3 将_bz2.cpython-36m-x86_64-linux-gnu.so放到对应的python3.6文件夹里…/python36/lib/python3.6/lib-dynload/
3.4 测试
python -c "import _bz2"