Общие библиотеки Python - гепард namemapper.so не найден - PullRequest
4 голосов
/ 01 декабря 2010

Я использую 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.Оказывается, я скомпилировал Cheetah на 32-битной машине и пытался загрузить общую библиотеку на 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

И оказалось, что Гепард не так хорошо работает на Python <= 2.6, поэтому ябудет обновление. </p>

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010
  1. Убедитесь, что _namemapper.so находится в одном из путей в sys.path, когда ваш скрипт вызывается. Возможно, что-то настроено неправильно (может быть, где-то установлен другой питон, например, в вашем домашнем каталоге).

    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 неверна.

2 голосов
/ 02 декабря 2010

Иногда полезно использовать strace для распечатки открытых вызовов для отслеживания пути поиска, используемого Python.

например.Если имя модуля, который вы пытаетесь импортировать, называется namemapper, ниже будут показаны пути, по которым производится поиск модуля namemapper.

strace -e open python -c 'import namemapper'

Это может дать вам некоторые подсказки о том, почему ваш модуль неused.

Edit: исправлено написание имени модуля в командной строке strace выше.

...