本文来自依云's Blog,转载请注明。
曾经,我辛苦两星期自以为终于弄好了 Vim 的 +python3 特性,却未曾想到,编译新发布的安装 Python3.2 后 Vim 的 Python3 支持再次悲剧……
事情是这样的。在vim-cn群有人编译 Python3.2 出错问我。我于是把之前为尝新鲜而 make 的 Python3.2 又 make install 了。然后 ./configure 时就出问题了。具体错误不记得了,反正是找不到什么文件。后来我找出了我以前写的一个从 C 调用 Python 代码的小程序,编译通过,链接时找不到某些符号。折腾了好久,才知道是 Python3.2 的安装出错了,./configure 时要加 --enable-shared 参数。当然,我还比较习惯加上 --with-wide-unicode 参数。
于是我的 C 小程序编译运行成功。但 Vim 的依旧悲剧。看了 src/configure.in,注意到它并没有使用 pkg-config,而是按以前 Python 的头文件和库文件的规律硬编码进去的。这时我才发现 Python 的相关文件/目录都多了个 mu 后缀:
>>> pkg-config --cflags --libs python-3.2 -I/usr/local/include/python3.2mu -L/usr/local/lib -lpython3.2mu >>> ls -li /usr/local/bin/python* 163890 -rwxr-xr-x 3 root root 10877 2011-03-01 23:16 /usr/local/bin/python3 163890 -rwxr-xr-x 3 root root 10877 2011-03-01 23:16 /usr/local/bin/python3.2 164216 lrwxrwxrwx 1 root root 18 2011-03-01 23:18 /usr/local/bin/python3.2-config -> python3.2mu-config 163890 -rwxr-xr-x 3 root root 10877 2011-03-01 23:16 /usr/local/bin/python3.2mu 164107 -rwxr-xr-x 1 root root 1827 2011-03-01 23:18 /usr/local/bin/python3.2mu-config 164252 lrwxrwxrwx 1 root root 16 2011-03-01 23:18 /usr/local/bin/python3-config -> python3.2-config
这个 mu 后缀是什么意思呢?搜了半天,终于找到了:m 是普通版,u 是宽字符版(--with-wide-unicode),还有个 d 表示使用了 --with-pydebug 参数编译的。加了这些后缀,于是 Vim 配置脚本的硬编码就失败了。(它为什么要硬编码呢……T.T)对于 mu 版,修改方法是这样的:
# For Python3.2 if which python3 >/dev/null 2>&1 && [ $(python3 -c 'import sys; print(sys.version_info.minor)') -ge 2 ]; then sed -i -e 's|-lpython${vi_cv_var_python3_version}[dmu]*|-lpython${vi_cv_var_python3_version}mu|' \ -e 's|python${vi_cv_var_python3_version}/config[^"]*|python${vi_cv_var_python3_version}/config-3.2mu|' \ -e 's|include/python${vi_cv_var_python3_version}[dmu]*|include/python${vi_cv_var_python3_version}mu|' \ src/configure.in # Fixed: no longer needed. # sed -i -e 's|PyEval_InitThreads();|/* PyEval_InitThreads(); */|' \ # src/if_python3.c autoconf=1 fi [ $autoconf -eq 1 ] && (cd src && autoconf)
后面那个对 src/if_python3.c 的修改我也不知道是为什么,反正不这样的话调用 Python 时就 SIGABRT 出错退出,而这样改了之后好像也没什么负面影响。至于找出这个语句的办法嘛,当然是不知比 jdb 好用多少倍的 gdb 啰。
2011年4月19日更新:修正了 Python3 接口的内存泄漏问题,发现已不再需要删掉那句代码了(删掉后反而出错)。
Mar 05, 2011 01:24:08 AM
http://www.python.org/dev/peps/pep-3149/
是这个?
Mar 05, 2011 08:52:47 AM
就是它了。原来是和 pyc 文件的变化一起改的啊,我还很不善于看 PEP。
Mar 06, 2011 04:37:41 AM
Python?是什么?
Mar 12, 2011 10:37:01 AM
(*^__^*) 嘻嘻…… 随便逛逛