Исполняемый файл 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?

1469   9  

9 ответов:

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

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 to /etc/ld.so.conf и работать ldconfig. Конечно, это общесистемная установка.

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

лучший способ, который я нашел для решения этой проблемы, - это во время компиляции. Так как вы один префикс настройки в любом случае может также сказать исполняемому файлу явно, где найти его общие библиотеки. В отличие от OpenSSL и других программных пакетов, Python не дает вам хороших директив настройки для обработки альтернативных путей к библиотеке (не все вы знаете 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, что у него есть библиотеки времени выполнения, которые ему нужны в этом конкретном пути. Вы можете использовать эту идею для обработки зависимостей, установленных в другом месте, чем стандартные системные местоположения. Например, в моих системах, поскольку у меня нет корневого доступа и мне нужно сделать почти полностью автономные установки 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, etc) в extlib каталог внутри самого дерева каталогов python. Таким образом, я могу смолить каталог python-${PYTHON_VERSION} и посадить его в любом месте, и он будет "работать" (при условии, что вы не столкнетесь с libc или libm конфликты). Это также помогает при попытке запустить несколько версий Python в одном окне, так как вам не нужно постоянно менять свой LD_LIBRARY_PATH или беспокоиться о выборе неправильной версии Python библиотека.

Edit: забыл упомянуть,компиляция будет жаловаться, если вы не установите 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 by Коллекции Программного Обеспечения на 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

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

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 (verbose) была просто, чтобы увидеть, что происходит. Я видел, что он сделал: /opt / rh/rh-python35 / root / usr / lib64: libpython3.так.резус-python35 -> libpython3. so. rh-python35 libpython3.5м.так.резус-python35-1.0 -> libpython3.5м.так.резус-python35-1.0

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

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

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, как показано выше.

На Солярисе 11

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

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

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

просто установите python-lib. (python27-lib). Он будет установить libpython2.7.сц1.0. Мы не требуем, чтобы вручную установить ничего.

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

./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: не удается открыть файл общего объекта: нет такого файла или каталога

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

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

$ sudo apt-get install python2.7-dev

все, что ему нужно, это установка libpython [3 или 2] dev files installation.

Comments

    Ничего не найдено.