144 votes

Python exécutable ne pas trouver libpython bibliothèque partagée

Je suis d'installer 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'essaie d'exécuter le fichier /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 je lance la commande ldd /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 dois-je dire à Python où trouver libpython?

206voto

Tamás Points 18211

Essayez les solutions suivantes:

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

Remplacer /usr/local/lib le dossier où vous avez installé libpython2.7.so.1.0 si elle n'est pas en /usr/local/lib.

Si cela fonctionne et si vous voulez rendre les modifications permanentes, vous avez deux options:

  1. Ajouter export LD_LIBRARY_PATH=/usr/local/lib votre .profile dans votre répertoire home (cela ne fonctionne que si vous utilisez un shell qui permet de charger ce fichier lorsqu'une nouvelle instance du shell est lancé). Cela affectera votre utilisateur.

  2. Ajouter /usr/local/lib de /etc/ld.so.conf et exécutez ldconfig. C'est un système à l'échelle de réglage de cours.

81voto

Foosh Points 101

Mettre sur mon fossoyeur chapeau...

Le meilleur moyen que j'ai trouvé à l'adresse c'est au moment de la compilation. Puisque vous êtes le seul réglage préfixe de toute façon, pourrait tout aussi bien dire l'exécutable explicitement où trouver ses bibliothèques partagées. Contrairement à d'OpenSSL et autres logiciels, Python ne vous donne pas agréable de configurer des directives pour gérer suppléant de la bibliothèque des chemins (pas tout le monde est à la racine, vous savez...) Dans le cas le plus simple de tous 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 non-linux version:

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

Le "rpath" drapeau indique à python qu'il a des bibliothèques d'exécution dont il a besoin dans cette voie-là. Vous pouvez prendre cette idée pour gérer les dépendances installé à un emplacement différent de la norme emplacements du système. Par exemple, sur mes systèmes depuis je n'ai pas de racine et le besoin de faire presque complètement autonome Python installe 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 de compiler les bibliothèques que python utilise (comme ffi, readline, etc) dans un extlib répertoire dans le répertoire python arbre lui-même. De cette façon, je peux goudron python-répertoire de la version et de la terre n'importe où et il va "travailler" (à condition de ne pas exécuter dans la libc ou libm conflits). Cette aide aussi quand vous essayez d'exécuter plusieurs versions de Python sur la même case que vous n'avez pas besoin de changer votre LD_LIBRARY_PATH ou des inquiétudes au sujet de la cueillette de la mauvaise version de la bibliothèque Python.

Edit: j'ai Oublié de mentionner, la compilation va se plaindre si vous n'avez pas défini la variable d'environnement PYTHONPATH à ce que vous utiliser comme préfixe et ne parviennent pas à compiler quelques modules...

21voto

Omer Dagan Points 889

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

Si vous savez où libpython réside à l', j'ai supposé qu'il serait /usr/local/lib/libpython2.7.so.1.0 dans votre cas, il vous suffit de créer un lien symbolique:

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

Puis essayez d'exécuter ldd nouveau et de voir si cela a fonctionné.

0voto

Pankaj Soni Points 91

Je l'ai installé à l'aide de la commande suivante:

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

faire

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 le 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

Puis, je me suis déconnecté de la racine de l'utilisateur et de nouveau essayé d'exécuter du python et cela a fonctionné avec succès.

-1voto

chin2 Points 1

il suffit d'installer python-lib. (python27-lib). Il va installer libpython2.7.rs1.0. Nous n'avons pas besoin de régler manuellement quoi que ce soit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X