pythoncheetah

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.

Any ideas?

SOLVED

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.


Solution

    1. 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
      
    2. 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.