Xupeng's blog

圆外之大,心向往之

重新编译python以后mod_python出问题了

也不是完全不能用了,我的moinmoin在mod_python下运行还基本良好,就是当我早上要查找一个文档时发现moin的“查找网页”功能出了问题,错误信息如下:

ImportError

/usr/lib/python2.4/lib-dynload/array.so: undefined symbol: PyUnicodeUCS4_FromUnicode

If you want to report a bug, please save this page and attach it to your bug report.

起初我并不知道这是mod_python的问题,也不知道这个PyUnicodeUCS4_FromUnicode 是什么意思,当然也没有认为这是moinmoin的问题,因为一星期以来moinmoin运行的都很好,没有出现过任何问题。猜测是python本身的原 因吧,因为这两天总是因为某些问题重新编译python,比如最初编译python时我没有使用”tcltk”这个USE,导致了python不支持 tk,于是我就重新编译了他,于是我的moinmoin就有小恙了。

equery u python看一下上次编译python时使用的USE:

osr root # equery u python
[ Searching for packages matching python... ]
[ Colour Code : set unset ]
[ Legend : Left column (U) - USE flags from make.conf ]
[ : Right column (I) - USE flags packages was installed with ]
[ Found these USE variables for dev-lang/python-2.4.3-r1 ]
U I
+ + X : Adds support for X11
+ + berkdb : Adds support for sys-libs/db (Berkeley DB for MySQL)
- - bootstrap : !!internal use only!! DO NOT SET THIS FLAG YOURSELF!, used duri ng original system bootstrapping
- - build : !!internal use only!! DO NOT SET THIS FLAG YOURSELF!, used for creating build images and the first half of bootstrapping.
+ + doc : Adds extra documentation (API, Javadoc, etc)
+ + gdbm : Adds support for sys-libs/gdbm (GNU database libraries)
- - ipv6 : Adds support for IP version 6
+ + ncurses : Adds ncurses support (console display library)
- - nocxx : Disable support for C++ (DON'T USE THIS UNLESS YOU KNOW WHAT YO U'RE DOING)
+ + readline : Enables support for libreadline, a GNU line-editing library tha t almost everyone wants
+ + ssl : Adds support for Secure Socket Layer connections
+ + tcltk : Support for Tcl and/or Tk GUI toolkits
- - ucs2 : Enable byte size 2 unicode
osr root #

注:+ +是编译时使用的USE,- -是支持但没有使用的USE

发 现有一个叫ucs2的USE我没有使用,跟那个UCS4长的有点像,好,google一下看看是什么东西,惊奇的发现我遇到的问题是跟 mod_python相关的,说我的这个问题是因为我的python编译的时候使用了两字节的Unicode字符,但是我的mod_python扩展是使 用四字节Unicode字符支持的python编译的。要检查自己的python的unicode字符长度,可以检查sys.maxunicode的值:

>>> import sys
>>> if sys.maxunicode > 65535:
... print 'UCS4 build'
... else:
... print 'UCS2 build'

找 到原因了,恍惚中记得我有一次编译python时使用了那个不知道是什么意思的ucs2 USE(只因为看到了它对unicode的支持,以为这是好事),可是我的python现在没有使用这个USE啊,因为我的sys.maxunicode =1114111,可是我的mod_python怎么会还不能正常工作?

突然想起来gentoo下编译完一个包以后,需要重新编译依赖它的包,而mod_python是依赖python,所以我也需要重新编译mod_python,试一下。

哈哈,好了,问题得到解决。

教训

  1. 千万不要望文生义。比如看到ucs2的unicode支持就盲目的认为这是支持unicode,总是好的
  2. 要体味别人强调过的话的意思,而不能只是一带而过不求甚解。我这次就翻船在编译过依赖包以后没有重新编译依赖它的包,而这恰恰是gentoo强调的。

Comments