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

4 投票
2 回答
4490 浏览
提问于 2025-04-16 07:53

我正在使用Python的Cheetah来生成模板,但我无法让它使用已经安装的编译好的_namemapper.so库。我是在CentOS 5.4上运行,安装了Python 2.4,使用的是Cheetah 2.4.3。无论我怎么努力,都无法让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位的机器上加载这个共享库。真是太糟糕了!

>>> 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 2.6及以下的版本上运行得不太好,所以我打算升级一下。

2 个回答

2

有时候,使用strace这个工具来打印出打开的调用是很有用的,这样可以追踪Python在寻找模块时的路径。

比如说,如果你想导入的模块叫做namemapper,下面的命令就会显示Python在寻找这个namemapper模块时所查找的路径。

strace -e open python -c 'import namemapper'

这可能会给你一些线索,帮助你找出为什么你的模块没有被使用。

补充说明:上面strace命令行中的模块名称拼写已更正。

2
  1. 确保在运行你的脚本时,_namemapper.so 文件在 sys.path 中的某个路径下。可能是某些配置出错了,比如你电脑上可能安装了另一个 Python 版本,可能就在你的用户目录里。

    import sys
    sys.path
    
  2. 如果这个库确实被加载了,接下来检查一下它的版本是否正确。看起来 Cheetah 会尝试从 _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 版本不对。

撰写回答