Исполняемый файл 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. Нам не нужно вручную устанавливать что-либо.