Исполняемый файл Python не находит общую библиотеку libpython - PullRequest
126 голосов
/ 24 октября 2011

Я устанавливаю Python 2.7 в CentOS 5. Я собрал и установил Python следующим образом

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

Когда я пытаюсь запустить / usr / local / bin / python, я получаю это сообщение об ошибке

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

Когда я запускаю ldd в / usr / local / bin / python, я получаю

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)

Как мне сообщить Python, где найти libpython?

Ответы [ 9 ]

195 голосов
/ 24 октября 2011

Попробуйте следующее:

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

Замените /usr/local/lib на папку, в которую вы установили libpython2.7.so.1.0, если ее нет в /usr/local/lib.

Если это работает и вы хотите сделать изменения постоянными, у вас есть два варианта:

  1. Добавьте export LD_LIBRARY_PATH=/usr/local/lib в .profile в вашем домашнем каталоге (это работает, только если вы используете оболочку, которая загружает этот файл при запуске нового экземпляра оболочки). Этот параметр влияет только на вашего пользователя.

  2. Добавьте /usr/local/lib к /etc/ld.so.conf и выполните ldconfig. Конечно, это общесистемная настройка.

72 голосов
/ 30 октября 2014

Надев шляпу могильщика ...

Лучший способ, который я нашел для решения этой проблемы, - это время компиляции. Так как вы в любом случае используете префикс с одним параметром, он может явно указать исполняемому файлу, где найти его разделяемые библиотеки. В отличие от OpenSSL и других программных пакетов, Python не дает вам хороших директив configure для обработки альтернативных путей к библиотекам (не все знают, что вы root) ... В простейшем случае все, что вам нужно, это следующее:

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

Или, если вы предпочитаете версию без Linux:

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

Флаг "rpath" сообщает Python, что у него есть библиотеки времени выполнения, в которых он нуждается по этому конкретному пути. Вы можете продолжить эту идею для обработки зависимостей, установленных в другом месте, чем стандартные системные расположения. Например, в моих системах, поскольку у меня нет доступа с правами root, и мне нужно почти полностью выполнить автономную установку Python, моя строка конфигурации выглядит следующим образом:

./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"

В этом случае я собираю библиотеки, которые использует python (например, ffi, readline и т. Д.), В каталог extlib в самом дереве каталогов python. Таким образом, я могу смонтировать каталог python - $ {PYTHON_VERSION} и поместить его куда угодно, и он будет «работать» (при условии, что вы не столкнетесь с конфликтами libc или libm). Это также помогает при попытке запустить несколько версий Python на одной и той же машине, поскольку вам не нужно постоянно менять LD_LIBRARY_PATH или беспокоиться о выборе неверной версии библиотеки Python.

Редактировать: Забыл упомянуть, компиляция будет жаловаться, если вы не установите для переменной окружения PYTHONPATH то, что вы используете в качестве префикса , и не сможете скомпилировать некоторые модули, например, чтобы расширить В приведенном выше примере установите PYTHONPATH на префикс, используемый в приведенном выше примере, с помощью export PYTHONPATH=/apps/python-${PYTHON_VERSION} ...

18 голосов
/ 16 октября 2013

У меня была такая же проблема, и я решил ее следующим образом:

Если вы знаете, где находится libpython, я предположил, что в вашем случае это будет /usr/local/lib/libpython2.7.so.1.0, вы можете просто создать символическую ссылку на него:

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

Затем попробуйте снова запустить ldd и посмотрите, сработало ли оно.

5 голосов
/ 11 августа 2017

Я установил Python 3.5 от Software Collections на CentOS 7 минимально.Все это работало само по себе, но я увидел ошибку общей библиотеки, упомянутую в этом вопросе, когда я попытался запустить простой 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

Я хотел постоянное общесистемное решение, которое работает для всех пользователей, поэтомуэто исключало добавление операторов экспорта в файлы .profile или .bashrc.Существует однострочное решение, основанное на странице Red Hat .Спасибо за комментарий, который указывает на это:

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

После перезапуска все хорошо в оболочке, но иногда мой веб-сервер все еще жалуется.Есть другой подход, который всегда работал как для оболочки, так и для сервера, и является более общим.Я увидел решение здесь , а затем понял, что оно на самом деле упоминается и в одном из ответов здесь!В любом случае, в CentOS 7 это следующие шаги:

 vim /etc/ld.so.conf

Который на моей машине только что имел:

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

Итак, я создал новый файл:

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

И добавил:

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

И вручную перестроить кеш:

sudo ldconfig

Вот и все, скрипты работают отлично!

Это было временное решение, котороене работал при перезагрузке:

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

Опция -v (многословно) состояла в том, чтобы просто посмотреть, что происходит.Я видел, что он сделал: / 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

Эта конкретная ошибка исчезла.Кстати, мне пришлось chown пользователя, чтобы apache избавился от ошибки разрешения после этого.

Обратите внимание, что я использовал find , чтобы найти каталог для библиотеки.Вы также можете сделать:

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

Что на моей виртуальной машине возвращает:

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

Какой путь мне нужно указать ldconfig, как показано выше.

1 голос
/ 09 сентября 2018

В Solaris 11

Используйте LD_LIBRARY_PATH_64 для разрешения символической ссылки на библиотеки python.

В моем случае для python3.6 LD_LIBRARY_PATH не работало, ноLD_LIBRARY_PATH_64 сделал.

Надеюсь, это поможет.
С уважением

1 голос
/ 12 января 2018

Это сработало для меня ...

$ sudo apt-get install python2.7-dev
0 голосов
/ 10 июня 2018

Все, что для этого нужно - это установка файлов libpython [3 или 2] dev.

0 голосов
/ 22 сентября 2014

Я установил с помощью команды:

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

make

Теперь как пользователь root:

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

Затем я попытался выполнить python и получил ошибку:

/ usr / local / bin / python: ошибка при загрузке общих библиотек: libpython2.7.so.1.0: невозможно открыть общий объектный файл: такого файла или каталога нет

Затем я вышел из системы от пользователя root и снова попытался выполнить Python, и он успешно работал.

0 голосов
/ 01 марта 2014

просто установите python-lib. (Python27 Пб). Он установит libpython2.7.so1.0. Нам не нужно ничего устанавливать вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...