PyXMLでのundefined symbolエラー
最近ではどの程度使われているか分かりませんが、Python 2.4環境下でのエラーです。
Python 2.4 + Vine 4.2の環境で発生しました。
undefined symbol
minidom.parseとかxml.parsers.expatを使用したときに発生しました。
File "/usr/lib/python2.4/site-packages/_xmlplus/dom/minidom.py", line 1914, in parse File "/usr/lib/python2.4/site-packages/_xmlplus/dom/expatbuilder.py", line 32, in ? File "/usr/lib/python2.4/site-packages/_xmlplus/parsers/expat.py", line 4, in ? ImportError: /usr/lib/python2.4/site-packages/_xmlplus/parsers/pyexpat.so: undefined symbol: XML_StopParser
pyexpat.soでXML_StopParserが見つからないというエラーです。状況によっては他のシンボルかもしれません。
原因
原因はリンクされているlibexpatが古いという所にありそうです。そのため、Vine 4.2並みに古いディストリビューションじゃないと起こらないと思います。
Vine 4.2で使用されているexpatは1.95.8と古いため、問題が発生します。
解決方法
libexpatを最新版(2.0.1)に変更すれば解消します。
ただし、Vine 4.2では依存関係の問題で単純にlibexpatを入れ替えることができません。そこで、問題を解決するためPyXMLをlibexpatを静的リンクで再ビルドしました。
python-pyxmlをアンインストール
aptでpython-pyxmlをアンインストールします。
# apt-get remove python-pyxml
expat-2.0.1のインストール
expatのページからexpat-2.0.1.tar.gzをダウンロードし、ビルドします。
% tar zxvf expat-2.0.1.tar.gz % cd expat-2.0.1 % ./configure --prefix=/opt/expat-2.0.1 --enable-shared=no <-- 共有ライブラリを作成しない % make # make install
PyXMLのインストール
PyXMLのページからPyXML-0.8.4.tar.gzをダウンロードします。 expatをインストールしたら、スタティックリンクでPyXMLをビルドします。上で共有ライブラリを作成していないので強制的にスタティックリンクされます。共有ライブラリを作成しているとそれが使われてしまうので、削除するかどこかに移動しておく必要があります。
% tar zxvf PyXML-0.8.4.tar.gz % cd PyXML-0.8.4 % python setup.py build --with-libexpat=/opt/expat-2.0.1 # python setup.py install
以上でexpat-2.0.1を使用したPyXMLがインストールされました。