L'exécutable Python ne trouve pas la bibliothèque partagée libpython

143

J'installe Python 2.7 sur CentOS 5. J'ai construit et installé Python comme suit

./configure --enable-shared --prefix=/usr/local
make
make install

Lorsque j'essaye d'exécuter / usr / local / bin / python, j'obtiens ce message d'erreur

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

Quand j'exécute ldd sur / usr / local / bin / python, j'obtiens

ldd /usr/local/bin/python
    libpython2.7.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000)
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000)
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000)

Comment dire à Python où trouver libpython?

sans
la source

Réponses:

204

Essayez ce qui suit:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

Remplacez-le /usr/local/libpar le dossier dans lequel vous avez installé libpython2.7.so.1.0s'il ne se trouve pas /usr/local/lib.

Si cela fonctionne et que vous souhaitez rendre les modifications permanentes, vous avez deux options:

  1. Ajoutez export LD_LIBRARY_PATH=/usr/local/libà votre .profiledans votre répertoire personnel (cela ne fonctionne que si vous utilisez un shell qui charge ce fichier lorsqu'une nouvelle instance de shell est démarrée). Ce paramètre n'affectera que votre utilisateur.

  2. Ajouter /usr/local/libà /etc/ld.so.confet exécuter ldconfig. Il s'agit bien sûr d'un paramètre à l'échelle du système.

Tamás
la source
Existe-t-il un moyen de l'exporter pour qu'il fonctionne avec eclipse? Je l'ai ajouté à mon .profile, mais Eclipse ne peut pas lancer gdb. (Remarque: l'ajouter à ld.so.conf fonctionne cependant)
Setheron
J'ai donc vérifié les variables d'environnement avec lesquelles eclipse s'exécute et il a le LD_LIBRARY_PATH approprié. Je crois que lorsqu'il lance GDB, il n'utilise aucun shell et n'obtient donc aucune variable d'environnement! La configuration de la libpython dans la configuration de débogage n'a pas non plus aidé puisque ce n'est que lorsque gdb se charge réellement (mais j'ai besoin de la bibliothèque pour que gdb se charge)
Setheron
1
Pouvez-vous déboguer l'application avec succès lorsque vous exécutez à gdbpartir de la ligne de commande et que LD_LIBRARY_PATH est correctement configuré dans le terminal? Sinon, vous devrez probablement configurer LD_LIBRARY_PATH dans votre .gdbinitfichier. Voir cette réponse pour plus d'informations: stackoverflow.com/a/7041845/156771
Tamás
J'ai besoin du LD_LIBRARY_PATH pour lancer gdb (libs python) pas pour le débogage réel de mon application. Jusqu'à présent, je n'ai réussi à le réparer qu'en le définissant dans ldconfig. Je peux toutefois déboguer l'application via CLI car elle récupérera le LD_LIBRARY_PATH de mon fichier ZSHRC.
Setheron du
10
Juste une note pour tous ceux qui essaient ceci: C'est juste "/ usr / local / lib", et non un "include" de départ comme l'original "include ld.so.conf.d / *. Conf".
timss
79

Mettre mon chapeau de fossoyeur ...

Le meilleur moyen que j'ai trouvé pour résoudre ce problème est au moment de la compilation. Puisque vous êtes de toute façon le préfixe de réglage, autant dire explicitement à l'exécutable où trouver ses bibliothèques partagées. Contrairement à OpenSSL et à d'autres logiciels, Python ne vous donne pas de bonnes directives de configuration pour gérer d'autres chemins de bibliothèque (tout le monde n'est pas root, vous savez ...) Dans le cas le plus simple, tout ce dont vous avez besoin est le suivant:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-Wl,--rpath=/usr/local/lib"

Ou si vous préférez la version non linux:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-R/usr/local/lib"

Le rpathdrapeau " " indique à python qu'il a des bibliothèques d'exécution dont il a besoin dans ce chemin particulier. Vous pouvez approfondir cette idée pour gérer les dépendances installées à un emplacement différent de celui des emplacements système standard. Par exemple, sur mes systèmes, puisque je n'ai pas d'accès root et que je dois effectuer des installations Python presque complètement autonomes, ma ligne de configuration ressemble à ceci:

./configure --enable-shared \
            --with-system-ffi \
            --with-system-expat \
            --enable-unicode=ucs4 \
            --prefix=/apps/python-${PYTHON_VERSION} \
            LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \
            CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"

Dans ce cas , je suis compilant les bibliothèques que les utilisations de python (comme ffi, readline, etc.) dans un extlibrépertoire dans l'arborescence de répertoire python lui - même. De cette façon, je peux tarer le répertoire python - $ {PYTHON_VERSION} et l'atterrir n'importe où et cela "fonctionnera" (à condition que vous n'ayez pas de conflit libcou de libmconflit). Cela aide également lorsque vous essayez d'exécuter plusieurs versions de Python sur la même boîte, car vous n'avez pas besoin de continuer à changer votre LD_LIBRARY_PATHou de vous soucier de choisir la mauvaise version de la bibliothèque Python.

Edit: J'ai oublié de mentionner, la compilation se plaindra si vous ne définissez pas la PYTHONPATHvariable d'environnement sur ce que vous utilisez comme préfixe et ne parvenez pas à compiler certains modules, par exemple, pour étendre l'exemple ci-dessus, définissez le PYTHONPATHsur le préfixe utilisé dans ce qui précède exemple avec export PYTHONPATH=/apps/python-${PYTHON_VERSION}...

Foosh
la source
//, Cela ressemble à ce que je recherche. Où puis-je trouver plus d'informations sur les moyens de "tarer le répertoire de la version python et de le placer n'importe où et cela" fonctionnera "(à condition que vous ne rencontriez pas de conflits libc ou libm)" ? Pensez-vous que cela vaut la peine de poser une question distincte à stackoverflow.com?
Nathan Basanese
//, De plus, comment définir $PYTHON_VERSION?
Nathan Basanese
//, j'ai mis $PYTHON_VERSIONaprès la configuration. Même avec l' $PYTHON_VERSIONensemble, cependant, le compilateur se plaint dePython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
Nathan Basanese
//, Cela nécessite-t-il des modifications de la makecommande et d'autres commandes d'installation?
Nathan Basanese
1
@NathanBasanese dans le cas du manque bz2, malédictions, gdbm, LZMA, etc vous devez compiler chacun de ces premiers avec un préfixe /apps/python-${PYTHON_VERSION}/extlibpour assurer leurs bibliothèques et les en- têtes sont au bon endroit pour le processus de Python faire pour trouver. En ce qui concerne les packages de niveau système, vous seriez probablement bloqué en vous appuyant sur un utilisateur root pour les installer à l'avance. Ou trouver une alternative qui peut être compilée et atterri dans leextlib
Foosh
21

J'ai eu le même problème et je l'ai résolu de cette façon:

Si vous savez où se trouve libpython, je suppose que ce serait /usr/local/lib/libpython2.7.so.1.0dans votre cas, vous pouvez simplement créer un lien symbolique vers celui-ci:

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

Ensuite, essayez de lddrecommencer et voyez si cela a fonctionné.

Omer Dagan
la source
6

J'ai installé Python 3.5 par Software Collections sur CentOS 7 minimal. Tout a bien fonctionné tout seul, mais j'ai vu l'erreur de bibliothèque partagée mentionnée dans cette question lorsque j'ai essayé d'exécuter un simple script CGI:

tail /var/log/httpd/error_log
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory

Je voulais une solution permanente à l'échelle du système qui fonctionne pour tous les utilisateurs, ce qui excluait l'ajout d'instructions d'exportation aux fichiers .profile ou .bashrc. Il existe une solution en une seule ligne, basée sur la page des solutions Red Hat . Merci pour le commentaire qui le souligne:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh

Après un redémarrage, tout va bien sur le shell, mais parfois mon serveur web se plaint encore. Il existe une autre approche qui a toujours fonctionné à la fois pour le shell et le serveur, et qui est plus générique. J'ai vu la solution ici , puis j'ai réalisé qu'elle était également mentionnée dans l'une des réponses ici! Quoi qu'il en soit, sur CentOS 7, voici les étapes:

 vim /etc/ld.so.conf

Lequel sur ma machine avait juste:

include ld.so.conf.d/*.conf

J'ai donc créé un nouveau fichier:

vim /etc/ld.so.conf.d/rh-python35.conf

Et ajouté:

/opt/rh/rh-python35/root/usr/lib64/

Et pour reconstruire manuellement le cache:

sudo ldconfig

Voilà, les scripts fonctionnent bien!

C'était une solution temporaire, qui ne fonctionnait pas entre les redémarrages:

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v

L'option -v (verbose) était juste pour voir ce qui se passait. J'ai vu que c'était le cas: / opt / rh / rh-python35 / root / usr / lib64: libpython3.so.rh-python35 -> libpython3.so.rh-python35 libpython3.5m.so.rh-python35-1.0 -> libpython3.5m.so.rh-python35-1.0

Cette erreur particulière a disparu. Incidemment, je devais à chownl'utilisateur apache pour se débarrasser d'une erreur d'autorisation après cela.

Notez que j'ai utilisé find pour localiser le répertoire de la bibliothèque. Vous pouvez également faire:

sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0

Qui sur ma VM renvoie:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

Quel est le chemin que je dois donner à ldconfig, comme indiqué ci-dessus.

Nagev
la source
1
Vous auriez pu vous éviter des problèmes en accédant à /etc/profile.d et en créant un fichier contenant les éléments suivants: #!/bin/bashet source scl_source enable rh-python35dedans. access.redhat.com/solutions/527703
Doug
2

Sur Solaris 11

Utilisez LD_LIBRARY_PATH_64pour résoudre le lien symbolique vers les bibliothèques python.

Dans mon cas, python3.6 LD_LIBRARY_PATHn'a pas fonctionné mais LD_LIBRARY_PATH_64a fonctionné.

J'espère que cela t'aides.
Cordialement

basy
la source
1

Cela a fonctionné pour moi ...

$ sudo apt-get install python2.7-dev
Kyle Anderson
la source
Salut, ce n'est pas la bonne solution, car après cela, votre binaire python de construction personnalisé utilise le .so de celui que vous avez installé à partir d'apt-get. Cela peut poser des problèmes tant qu'ils ont la même version, ou si vous avez modifié le code source python, cela ne demandera pas d'efforts.
Azusa Nakano
0

J'ai installé en utilisant la commande:

./configure --prefix=/usr       \
            --enable-shared     \
            --with-system-expat \
            --with-system-ffi   \
            --enable-unicode=ucs4 &&

make

Maintenant, en tant qu'utilisateur root:

make install &&
chmod -v 755 /usr/lib/libpython2.7.so.1.0

Ensuite, j'ai essayé d'exécuter python et j'ai obtenu l'erreur:

/ usr / local / bin / python: erreur lors du chargement des bibliothèques partagées: libpython2.7.so.1.0: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type

Ensuite, je me suis déconnecté de l'utilisateur root et j'ai à nouveau essayé d'exécuter le Python et cela a fonctionné avec succès.

Pankaj
la source
0

Tout ce dont il a besoin est l'installation des fichiers de développement de libpython [3 ou 2].


la source
-1

installez simplement python-lib. (python27-lib). Il installera libpython2.7.so1.0. Nous n'avons pas besoin de définir quoi que ce soit manuellement.

chintan-p-bhatt
la source
4
//, Et si vous êtes sur, disons, CEntOS 6.3? Cela ne fonctionne pas, là-bas, et généralement les gens compilent Python pour faire face à un cas où le système Python est une version étrange, cassée, peu fiable ou un autre désir de ne pas toucher au système global.
Nathan Basanese