开发者

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 versi开发者_如何学Pythonon 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.


  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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜