2009-02-04 2 views
2

Я запускаю скрипт python на общем сервере хостинга, который до сегодняшнего дня имел версию MySQL версии 4. Теперь он имеет версию 5. Мой скрипт python больше не может подключаться к MySQL, так как он не может найти libmysqlclient_r.so.14 :Как я могу определить python, какую версию libmysqlclient.so использовать?

$ python my_script.py 
Traceback (most recent call last): 
File "my_script.py", line 6, in ? 
import MySQLdb 
File "/home/lib/python2.4/site-packages/PIL-1.1.6-py2.4-linux-i686.egg/__init__.py", line 19, in ? 

File "build/bdist.linux-i686/egg/_mysql.py", line 7, in ? 
File "build/bdist.linux-i686/egg/_mysql.py", line 6, in __bootstrap__ 
ImportError: libmysqlclient_r.so.14: cannot open shared object file: No such file or directory 

Существуют различные другие версии libmysqlclient в/USR/Lib:

/usr/lib/libmysqlclient.so.15 
/usr/lib/libmysqlclient.so.14 
/usr/lib/mysql/libmysqlclient.la 
/usr/lib/mysql/libmysqlclient.so 
/usr/lib/mysql/libmysqlclient_r.so 
/usr/lib/mysql/libmysqlclient_r.a 
/usr/lib/mysql/libmysqlclient_r.la 
/usr/lib/mysql/libmysqlclient.a 
/usr/lib/libmysqlclient.so 
/usr/lib/libmysqlclient_r.so 
/usr/lib/libmysqlclient_r.so.15 
/usr/lib/libmysqlclient_r.so.15.0.0 
/usr/lib/libmysqlclient.so.15.0.0 

Так что мой вопрос заключается в следующем: как я могу сказать питона (версия 2.4.3), какая версия libmysqlclient к использовать?

ответ

5

Вы не можете указать динамическому компоновщику, какую версию библиотеки использовать, поскольку SONAME (полное имя библиотеки + интерфейс) является частью двоичного файла.

В вашем случае вы можете попробовать загрузить libmysqlclient_r.so.14 на хост и установить LD_LIBRARY_PATH соответственно, поэтому сообщите динамическому компоновщику, какие каталоги будут искать дополнительно в системных каталогах при разрешении общих объектов.

Вы можете использовать ldd, чтобы увидеть, если он работает LD_LIBRARY_PATH:

$ ldd $path_to/_mysql.so 
... 
libmysqlclient_r.so.14 => $path_to_lib/libmysqlclient_r.so.14 
... 

В противном случае, будет сообщение об ошибке о нерешенных общих объектах.

Конечно, это может быть только временное исправление, пока вы не перестроете MySQLdb для использования новых библиотек.

+1

Кому-нибудь, кто может столкнуться с этим.Вы можете установить LD_LIBRARY_PATH следующим образом: (предположим bash) export LD_LIBRARY_PATH =/usr/lib/mysql /: $ LD_LIBRARY_PATH Очевидно, что ваш/usr/lib ... будет путем к вашей библиотеке. – user49913

0

Одним из решений является установка переменной окружения PYTHONPATH, чтобы иметь какой-либо локальный каталог, и скопировать (или ссылку, я полагаю) версию mysql lib, которую вы хотите.

+0

Привет, Сикора, спасибо. Я пробовал это, но он, похоже, не сработал. Это определенно случай, когда python будет выглядеть в PYTHONPATH для общих объектов? Интересно, есть ли еще одна переменная env, которую я пропускаю ... – Ben

+0

В соответствии с документацией, она будет _ всегда ... искать стандартные dirs _after_ any в PYTHONPATH, так что если это не работает для вас, это должно быть что-то еще. – sykora

+0

Это только для собственных загружаемых модулей Python, хотя (.pyd в Windows, .so on * ix). libmysqlclient.so - это еще одна библиотека *, связанная с * модулем Python _mysql.so. Только _mysql.so будет искать в PYTHONPATH. – bobince

1

Вам нужно будет перекомпилировать python-mysql (aka MySQLdb), чтобы связать его с новой версией libmysqlclient.

Если ваш хост изначально настроил среду, а не компилировал ее, вам придется приставать к ней.

/usr/lib/libmysqlclient.so.14

Это выглядит как остаток старого libmysqlclient, и должны быть удалены. Варианты _r и .a (статические) исчезли, и вы на самом деле не хотите, чтобы смесь библиотек все еще вокруг, это будет только путать с ошибкой automake.

Пока вы могли сделать символическую ссылку libmysqlclient_r.so.14 до .15, что бы работать только если новая версия клиента произошло иметь тот же ABI для функций, которые вы хотели использовать в качестве старый - и это маловероятно, так как в этом весь смысл изменения номера версии.

Смежные вопросы