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

143

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

без
источник

Ответы:

204

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

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

Тамаш
источник
Есть ли способ экспортировать его, чтобы он работал с Eclipse? Я добавил его в свой .profile, но тогда Eclipse не может запустить GDB. (Примечание: добавление его в ld.so.conf работает, однако)
Сетерон
поэтому я проверил переменные окружения, с которыми работает eclipse, и имеет ли он правильный LD_LIBRARY_PATH. Я считаю, что когда он запускает GDB, он не использует никакой оболочки и поэтому не получает никаких переменных окружения! Установка libpython в конфигурации отладки также не помогла, поскольку это происходит только при фактической загрузке GDB (но мне нужна
библиотека
1
Можете ли вы успешно отладить приложение, когда вы запускаете gdbиз командной строки и LD_LIBRARY_PATH правильно настроен в терминале? Если нет, вам, вероятно, придется настроить LD_LIBRARY_PATH в вашем .gdbinitфайле. См. Этот ответ для получения дополнительной информации: stackoverflow.com/a/7041845/156771
Тамас
Мне нужен LD_LIBRARY_PATH для запуска gdb (python libs), а не для фактической отладки моего приложения. До сих пор мне удалось это исправить, установив его в ldconfig. Я могу отладить приложение через CLI, потому что оно заберет LD_LIBRARY_PATH из моего файла ZSHRC.
Сетерон
10
Просто замечание для любого, кто пробует это: это просто "/ usr / local / lib", а не начальное "include", как оригинал "include ld.so.conf.d / *. Conf".
Timss
79

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

Лучший способ, который я нашел для решения этой проблемы, - это время компиляции. Так как вы в любом случае используете префикс с одним параметром, он может явно указать исполняемому файлу, где найти его разделяемые библиотеки. В отличие от 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_VERSION} каталога и посадить его в любом месте , и он будет «работать» ( при условии , что вы не столкнетесь в libcили libmконфликтов). Это также помогает при попытке запустить несколько версий Python на одном и том же компьютере, поскольку вам не нужно постоянно менять LD_LIBRARY_PATHили беспокоиться о выборе неправильной версии библиотеки Python.

Изменить: Забыл упомянуть, компиляция будет жаловаться, если вы не установите PYTHONPATHпеременную окружения на то, что вы используете в качестве префикса, и не сможете скомпилировать некоторые модули, например, чтобы расширить приведенный выше пример, установите PYTHONPATHпрефикс, используемый в приведенном выше пример с export PYTHONPATH=/apps/python-${PYTHON_VERSION}...

Foosh
источник
// Это похоже на то, что я ищу. Где я могу узнать больше о способах «заархивировать каталог python-version и разместить его где угодно, и он будет« работать »(при условии, что вы не столкнетесь с конфликтами libc или libm)» ? Как вы думаете, стоит ли делать из этого отдельный вопрос на stackoverflow.com?
Натан Басанезе
// Кроме того, как установить $PYTHON_VERSION?
Натан Басанезе
// я установил $PYTHON_VERSIONпосле настройки. Хотя даже с $PYTHON_VERSIONсетом, компилятор жалуется наPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
Натан Басанезе
// Требует ли это каких-либо изменений в makeкоманде и других командах установки?
Натан Басанезе
1
@NathanBasanese В случае отсутствия bz2, curses, gdbm, lzma и т. Д. Вам нужно сначала скомпилировать каждый из них с префиксом, /apps/python-${PYTHON_VERSION}/extlibчтобы убедиться, что их библиотеки и заголовки находятся в нужном месте для процесса сборки Python. Что касается пакетов системного уровня, вы, вероятно, застряли бы, полагаясь на пользователя root, чтобы установить их для вас заранее. Или найти альтернативу, которую можно скомпилировать и посадить вextlib
Foosh
21

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

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

Омер Даган
источник
6

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

Nagev
источник
1
Вы могли бы избежать некоторых проблем, перейдя в /etc/profile.d и создав файл со следующим: #!/bin/bashи source scl_source enable rh-python35в нем. access.redhat.com/solutions/527703
Даг
2

На Солярисе 11

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

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

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

Басы
источник
1

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

$ sudo apt-get install python2.7-dev
Кайл Андерсон
источник
Привет, это не правильное решение, потому что после этого ваш пользовательский двоичный файл Python для сборки использует .so из того, который вы установили из apt-get. Это может вызвать проблемы, если у них одинаковая версия или если вы изменили исходный код Python, это не потребует усилий.
Азуса Накано
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: невозможно открыть файл общего объекта: такого файла или каталога нет

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

Панкай
источник
0

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


источник
-1

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

Chintan-п-Бхатт
источник
4
// А если вы, скажем, на CEntOS 6.3? Там это не работает, и обычно люди собирают Python, чтобы иметь дело со случаем, когда системный Python является странной версией, сломанной, ненадежной или каким-то другим желанием не касаться всей системы.
Натан Басанезе