2009-02-04 5 views
2

Je cours un script python sur un serveur d'hébergement partagé qui avait jusqu'à ce matin MySQL version 4. Maintenant, il a la version 5. Mon script python ne peut plus se connecter à MySQL, car il ne peut pas trouver libmysqlclient_r.so.14 :Comment puis-je dire à python quelle version de libmysqlclient.so utiliser?

$ 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 

Il existe plusieurs autres versions de libmysqlclient dans/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 

Alors ma question est la suivante: comment puis-je dire python (version 2.4.3) quelle version de libmysqlclient à utilisation?

Répondre

5

Vous ne pouvez pas indiquer à l'éditeur de liens dynamique quelle version d'une bibliothèque utiliser, car SONAME (nom complet de la bibliothèque + interface) fait partie du binaire. Dans votre cas, vous pouvez essayer de télécharger libmysqlclient_r.so.14 sur l'hôte et définir LD_LIBRARY_PATH en conséquence, donc indiquez à l'éditeur de liens quels répertoires doivent rechercher en plus des répertoires système lors de la résolution des objets partagés.

Vous pouvez utiliser ldd pour voir si elle fonctionne LD_LIBRARY_PATH:

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

Sinon, il y aura un message d'erreur sur les objets partagés non résolus.

Bien sûr, cela ne peut être qu'un correctif temporaire jusqu'à ce que vous reconstruisiez MySQLdb pour utiliser les nouvelles bibliothèques.

+1

Pour tous ceux qui pourraient rencontrer cela.Vous pouvez définir votre LD_LIBRARY_PATH comme ceci: (en supposant que bash) export LD_LIBRARY_PATH =/usr/lib/mysql /: $ LD_LIBRARY_PATH évidemment votre/usr/lib ... serait le chemin de votre bibliothèque. – user49913

0

Une solution consiste à définir votre variable d'environnement PYTHONPATH pour avoir un répertoire local, et copier (ou lien, je suppose) la version de la lib mysql que vous voulez.

+0

Salut Sykora, merci - J'ai essayé, mais cela ne semble pas avoir fonctionné. Est-ce vraiment le cas que python cherchera dans PYTHONPATH pour les objets partagés? Je me demande s'il y a une autre variable d'environnement qui me manque ... – Ben

+0

Selon la documentation, il recherchera toujours les répertoires standard _after_ dans PYTHONPATH, donc si cela ne fonctionne pas pour vous, cela doit être quelque chose d'autre. – sykora

+0

C'est seulement pour les propres modules chargeables de Python (.pyd sur Windows, .so sur * ix). libmysqlclient.so est une autre bibliothèque * liée à * par le module Python _mysql.so. Seul _mysql.so sera recherché dans PYTHONPATH. – bobince

1

Vous devrez recompiler python-mysql (alias MySQLdb) pour l'amener vers la nouvelle version de libmysqlclient.

Si votre hôte a initialement configuré l'environnement plutôt que de le compiler, vous devrez le harceler.

/usr/lib/libmysqlclient.so.14

Cela ressemble à un vestige de l'ancien libmysqlclient, et doit être supprimé. Les versions _r et .a (statiques) ont disparu et vous ne voulez pas vraiment qu'un mélange de bibliothèques soit toujours présent, cela risquerait seulement de rendre l'automake plus confus.

Alors que vous pouvez faire un lien symbolique de libmysqlclient_r.so.14 à .15, ce serait ne fonctionnera que si la nouvelle version du client est arrivé à la même ABI pour les fonctions que vous vouliez utiliser comme vieux - et c'est assez improbable, car c'est tout l'intérêt de changer le numéro de version.

Questions connexes