解决源码编译Python3后缺少ssl tkinter,bz2等库的问题

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的依赖包比较多,我在这里花费了较长时间,主要参考了这片文章
https://www.cnblogs.com/luxuriance-lily/p/9090451.html

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"
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值