编译Python3.6.4关联Tcl8.6的方法及依赖Tcl8.5问题解决问询
解决Python 3.6.4编译关联Tcl 8.6并可移植打包的问题
首先得明确Python编译时选择Tcl/Tk版本的核心逻辑:
Python的configure脚本不是只靠头文件和库路径来确定Tcl/Tk版本的,它会优先寻找系统里的tclConfig.sh和tkConfig.sh——这两个是Tcl/Tk编译安装后生成的配置脚本,包含了版本、编译参数、依赖路径等关键信息。如果系统默认路径里有多个版本的这类脚本,configure会按路径优先级选最先找到的那个,这就是你之前只指定--with-tcltk-includes和--with-tcltk-libs却无效的原因:CentOS 7自带的Tcl 8.5的配置脚本还是被优先识别了。
接下来分三个阶段给出完整解决方案:
1. 手动编译安装独立的Tcl 8.6和Tk 8.6
由于CentOS 7官方源只有Tcl 8.5,我们需要自己编译8.6版本到自定义路径:
编译Tcl 8.6
# 下载Tcl 8.6.6源码(也可选兼容Python 3.6.4的更高8.6.x版本) wget https://prdownloads.sourceforge.net/tcl/tcl8.6.6-src.tar.gz tar -xvf tcl8.6.6-src.tar.gz cd tcl8.6.6/unix # 编译安装到指定路径 ./configure --prefix=/opt/mayur/tcl/8.6.6 make && make install
编译Tk 8.6(依赖Tcl 8.6)
wget https://prdownloads.sourceforge.net/tcl/tk8.6.6-src.tar.gz tar -xvf tk8.6.6-src.tar.gz cd tk8.6.6/unix # 指定依赖的Tcl路径,编译到同一目录 ./configure --prefix=/opt/mayur/tcl/8.6.6 --with-tcl=/opt/mayur/tcl/8.6.6/lib make && make install
2. 编译Python 3.6.4并关联Tcl/Tk 8.6
这次要直接让configure使用Tcl 8.6的配置脚本,而非仅指定头文件和库路径:
# 回到Python源码目录 cd Python-3.6.4 # 配置编译参数,关键是通过--with-tcl/--with-tk指向8.6版本的配置脚本,同时扩展rpath包含Tcl库路径 ./configure --prefix=/opt/mayur/python/3.6.4 --enable-unicode=ucs4 --enable-shared \ LDFLAGS="-Wl,-rpath /opt/mayur/python/3.6.4/lib:/opt/mayur/tcl/8.6.6/lib" \ --with-tcl=/opt/mayur/tcl/8.6.6/lib/tclConfig.sh \ --with-tk=/opt/mayur/tcl/8.6.6/lib/tkConfig.sh # 编译安装 make altinstall
验证关联是否成功:
/opt/mayur/python/3.6.4/bin/python3.6 -c "import tkinter; print(tkinter.TkVersion)"
如果输出8.6,说明Tcl/Tk版本关联正确。
3. 打包成可移植的tar包
为了让解压后在其他机器直接可用,需把Tcl/Tk的核心库整合到Python目录:
# 将Tcl/Tk库复制到Python的lib目录 cp /opt/mayur/tcl/8.6.6/lib/libtcl8.6.so /opt/mayur/python/3.6.4/lib/ cp /opt/mayur/tcl/8.6.6/lib/libtk8.6.so /opt/mayur/python/3.6.4/lib/ # 打包整个Python目录 tar cvf python3.6.4-portable.tar -C /opt/mayur/python/3.6.4/ .
这样打包后的文件,在其他CentOS 7机器上解压后,执行python3.6就能正常import tkinter——因为rpath已经设置为Python的lib目录,我们也把依赖的Tcl/Tk库复制进去了。
内容的提问来源于stack exchange,提问作者Mayur Buragohain
相关产品推荐
相关产品推荐

