4

我正在使用 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 位机器上加载共享库。哦!

>>> 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 上运行得不是很好,所以我会升级。

4

2 回答 2

2

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

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

strace -e open python -c 'import namemapper'

这可能会给你一些关于为什么你的模块没有被使用的线索。

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

于 2010-12-02T01:01:48.160 回答
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版本错误。

于 2010-12-02T01:15:18.403 回答