Исполняемый файл 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?
9 ответов:
попробуйте следующее:
LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/pythonзаменить
/usr/local/libс папкой, где вы установилиlibpython2.7.so.1.0если его нет в/usr/local/lib.если это работает, и вы хотите, чтобы сделать изменения постоянными, у вас есть два варианта:
добавить
export LD_LIBRARY_PATH=/usr/local/libна.profileв вашем домашнем каталоге (это работает только в том случае, если вы используете оболочку, которая загружает этот файл при запуске нового экземпляра оболочки). Этот параметр влияет на пользователя только.добавить
/usr/local/libto/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.0lddснова и посмотреть, если он работал.
Я установил 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, и он успешно работал.
Comments