Исполняемый файл 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?
Ответы
Ответ 1
Попробуйте следующее:
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/lib
в /etc/ld.so.conf
и запустите ldconfig
. Это, конечно, общесистемная настройка.
Ответ 2
Надеваю шляпу могильщика...
Лучший способ найти это - во время компиляции. Так как вы - один префикс настройки, все равно можете точно сказать исполняемому файлу, где найти его общие библиотеки. В отличие от 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 имеет библиотеки времени выполнения, необходимые ему в этом конкретном пути. Вы можете использовать эту идею для обработки зависимостей, установленных в другом месте, чем стандартные расположения систем. Например, в моих системах, так как у меня нет доступа 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}
...
Ответ 3
У меня была та же проблема, и я решил это так:
Если вы знаете, где находится 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
и проверьте, не сработало ли оно.
Ответ 4
Я установил с помощью команды:
./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, и он успешно работал.
Ответ 5
Я установил Python 3.5 Коллекции программного обеспечения на CentOS 7 минимально. Все это работало отлично само по себе, но я видел ошибку общей библиотеки, упомянутую в этом вопросе, когда я попытался запустить простой CGI script:
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. Я увидел решение здесь, а затем понял, что он действительно упоминается в одном из ответов здесь! В любом случае, на 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) - это просто посмотреть, что происходит. Я видел, что это произошло: /Опт/отн/отн-python35/корень/USR/lib64: libpython3.so.rh-python35 → libpython3.so.rh-python35 libpython3.5m.so.rh-python35-1.0 → libpython3.5m.so.rh-python35-1.0
Эта ошибка исчезла. Кстати, я должен был chmod для пользователя apache, чтобы избавиться от ошибки разрешения после этого.
Обратите внимание, что я использовал find для поиска каталога для библиотеки. Вы также можете сделать:
sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0
На моей VM возвращается:
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
Какой путь мне нужно передать ldconfig, как показано выше.
Ответ 6
Это сработало для меня...
$ sudo apt-get install python2.7-dev
Ответ 7
просто установите python-lib. (Python27 Пб). Он установит libpython2.7.so1.0. Нам не нужно вручную устанавливать что-либо.