Исполняемый файл Python не находит общую библиотеку libpython

Я устанавливаю 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?

10 ответов

Решение

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

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, Это общесистемная настройка, конечно.

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

Лучший способ, который я нашел для решения этой проблемы, - это время компиляции. Так как вы в любом случае используете префикс с одним параметром, он может явно указать исполняемому файлу, где найти его разделяемые библиотеки. В отличие от 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 "flag сообщает python, что у него есть библиотеки времени выполнения, которые ему нужны по этому конкретному пути. Вы можете пойти дальше этой идеи для обработки зависимостей, установленных в другом месте, чем стандартные местоположения системы. Например, в моих системах, так как у меня нет корневого доступа и мне нужно сделать почти полностью автономные установки 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}...

У меня была такая же проблема, и я решил ее так:

Если вы знаете, где находится 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 еще раз и посмотреть, сработало ли это.

Я установил 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, как показано выше.

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

$ sudo apt-get install python2.7-dev

На Солярисе 11

использование LD_LIBRARY_PATH_64 разрешить символическую ссылку на библиотеку Python.

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

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

Этот ответ будет полезен тем, у кого ограниченный доступ для авторизации на сервере.

У меня была аналогичная проблема на виртуальном хостинге HostGator. Python3.5приходилось включать каждый раз после входа в систему. Вот мои 10 шагов к разрешению:

  1. Включите питон через скрипт scl python_enable_3.5 или же scl enable rh-python35 bash.

  2. Убедитесь, что он включен, выполнив python3.5 --version. Это должно дать вам вашу версию Python.

  3. Выполнять which python3.5получить свой путь. В моем случае это было /opt/rh/rh-python35/root/usr/bin/python3.5. Вы можете использовать этот путь, чтобы снова получить версию (просто чтобы убедиться, что этот путь работает для вас).

  4. Отлично, теперь, пожалуйста, выйдите из текущей оболочки с помощью.

  5. Теперь давайте снова получим версию через этот полный путь python3.5 /opt/rh/rh-python35/root/usr/bin/python3.5 --version.

    Это не даст вам версию, а только ошибку. В моем случае это было

      /opt/rh/rh-python35/root/usr/bin/python3.5: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory
  1. Как упоминалось в ответе Тамаса , мы должны найти, что so файл. locate не работает на виртуальном хостинге, и вы не можете его установить.

    Используйте следующую команду, чтобы найти, где находится этот файл:

      find /opt/rh/rh-python35 -name "libpython3.5m.so.rh-python35-1.0"
  1. Вышеупомянутая команда напечатает полный путь (вторая строка) к файлу после его обнаружения. В моем случае вывод был
      find: `/opt/rh/rh-python35/root/root': Permission denied
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
  1. Вот полная команда для работы python3.5 на таком виртуальном хостинге, которая выдаст версию,
      LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5 --version
  1. Наконец, для краткости добавьте следующий псевдоним в свой ~ / .bashrc
      alias python351='LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5'
  1. Для проверки перезагрузите .bashrc к source ~/.bashrc и выполнить python351 --version.

Ну вот, теперь, когда вы снова входите в систему, у вас есть python351 приветствовать вас.

Это не ограничивается python3.5, но может быть полезен в случае других scl установленное программное обеспечение.

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

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

./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, и он успешно работал.

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

Другие вопросы по тегам