Python共享库 - 找不到Cheetah namemapper.so
我正在使用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 个回答
有时候,使用strace这个工具来打印出打开的调用是很有用的,这样可以追踪Python在寻找模块时的路径。
比如说,如果你想导入的模块叫做namemapper,下面的命令就会显示Python在寻找这个namemapper模块时所查找的路径。
strace -e open python -c 'import namemapper'
这可能会给你一些线索,帮助你找出为什么你的模块没有被使用。
补充说明:上面strace命令行中的模块名称拼写已更正。
确保在运行你的脚本时,
_namemapper.so
文件在sys.path
中的某个路径下。可能是某些配置出错了,比如你电脑上可能安装了另一个 Python 版本,可能就在你的用户目录里。import sys sys.path
如果这个库确实被加载了,接下来检查一下它的版本是否正确。看起来 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
版本不对。