Python shared libraries - Cheetah namemapper.so not found
I'm using Python Cheetah for template generation and I can't get it to use the compiled _namemapper.so library that is installed. I am running on CentOS 5.4 with Python 2.4 installed, using Cheetah 2.4.3. I cannot for the life of me get Cheetah to use the _namemapper.so file that I built during install:
Filling conf/asterisk/sip.conf.ect -> conf/asterisk/sip.conf ... /usr/lib64/python2.4/site-packages/Cheetah/Compiler.py:1508: UserWarning: You don't have the C version of NameMapper installed! I'm disabling Cheetah's useStackFrames option as it is painfully slow with the Python version of NameMapper. You should get a copy of Cheetah with the compiled C version of NameMapper.
However, I have the shared library sitting right next to the NameMapper modules:
$ ls -ltr /usr/lib64/python2.4/site-packages/Cheetah/ | grep -i namemap -rw-r--r-- 1 root root 12376 Jul 1 20:17 NameMapper.py -rwxr-xr-x 1 root root 36982 Dec 1 09:55 _namemapper.so -rw-r--r-- 1 root root 12541 Dec 1 09:55 NameMapper.pyc
I've tried adding this directory to /etc/ld.so.conf.d/python-cheetah.conf, and the _namemapper.so shared library is not found.
Thanks @alex-b. Turns out I had compiled Cheetah on a 32-bit machine and was attempting to load the shared library on a 64-bit machine. D'oh!
>>> from Cheetah._namemapper import NotFound Traceback (most recent call last): File "<stdin>", line 1, in ? ImportError: /usr/lib/python2.4/site-packages/Cheetah/_namemapper.so: wrong ELF class: ELFCLASS32
Then I ran into the next problem:
>>> from Cheetah._namemapper import NotFound Traceback (most recent call last): File "<stdin>", line 1, in ? ImportError: /usr/lib/python2.4/site-packages/Cheetah/_namemapper.so: undefined symbol: PyUnicode_FromFormat
And it turns out that Cheetah doesn't work so well on Python <= 2.6, so I will be upgrading.
Make sure that _namemapper.so is in one of the paths in sys.path when your script is invoked. It's possible that something is misconfigured (can be another python installed somewhere, for example, in your home directory).
import sys sys.path
If the library itself is indeed loaded, try checking if it's of the correct version. It seems that Cheetah tries to load particular functions from _namemapper (Utils/NameMapper.py:288):
try: from _namemapper import NotFound, valueForKey, valueForName, \ valueFromSearchList, valueFromFrameOrSearchList, valueFromFrame C_VERSION = True except: C_VERSION = False
If this fails, C_VERSION is set to False, which gives you this warning. Try importing these symbols from _namemapper yourself, it may be that your _namemapper.so version is wrong.
Sometimes it's useful to use strace to print out open calls to trace the search path used by Python.
eg. If the name of the module you're trying to import is namemapper, the following will show the paths searched for the namemapper module.
strace -e open python -c 'import namemapper'
This may give you some clues as to why your module is not being used.
Edit: corrected spelling of module name in the strace command-line above.