Python共享库 - Cheetah namemapper.so未找到

时间:2010-12-01 19:04:44

标签: python cheetah

我正在使用Python Cheetah进行模板生成,我无法使用已安装的已编译_namemapper.so库。我使用Cheetah 2.4.3在运行Python 2.4的CentOS 5.4上运行。我不能为我的生活让Cheetah使用我在安装期间构建的_namemapper.so文件:

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.

但是,我的共享库位于NameMapper模块旁边:

$ 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

我已尝试将此目录添加到/etc/ld.so.conf.d/python-cheetah.conf,但未找到_namemapper.so共享库。

有什么想法吗?

解决

谢谢@ alex-b。原来我在32位机器上编译了Cheetah,并试图在64位机器上加载共享库。 D'哦!

>>> 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

然后我遇到了下一个问题:

>>> 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

事实证明,Cheetah在Python&lt; = 2.6上的效果不佳,所以我将升级。

2 个答案:

答案 0 :(得分:2)

有时使用strace打印出打开的调用来跟踪Python使用的搜索路径是有用的。

例如。如果您尝试导入的模块的名称是namemapper,则以下将显示为namemapper模块搜索的路径。

strace -e open python -c 'import namemapper'

这可能会为您提供一些线索,说明您的模块未被使用的原因。

编辑:在上面的strace命令行中更正了模块名称的拼写。

答案 1 :(得分:2)

  1. 确保调用脚本时_namemapper.so位于sys.path中的其中一个路径中。可能是某些内容配置错误(可能是某个地方安装了另一个python,例如,在您的主目录中)。

    import sys
    sys.path
    
  2. 如果库本身确实已加载,请尝试检查它是否是正确的版本。似乎猎豹试图从_namemapper(Utils / NameMapper.py:288)加载特定的函数:

    try:
        from _namemapper import NotFound, valueForKey, valueForName, \
             valueFromSearchList, valueFromFrameOrSearchList, valueFromFrame
        C_VERSION = True
    except:
        C_VERSION = False
    

    如果失败,C_VERSION设置为False,这会给出此警告。尝试自己从_namemapper导入这些符号,可能是您的_namemapper.so版本错误。