Исполняемый файл 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?
10 ответов
Попробуйте следующее:
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
, Это общесистемная настройка, конечно.
Надеть шляпу могильщика...
Лучший способ, который я нашел для решения этой проблемы, - это время компиляции. Так как вы в любом случае используете префикс с одним параметром, он может явно указать исполняемому файлу, где найти его разделяемые библиотеки. В отличие от OpenSSL и других программных пакетов, Python не предоставляет хороших директив configure для обработки альтернативных путей к библиотекам (не все знают, что вы 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
"flag сообщает 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
и т. д.) в extlib
каталог внутри самого дерева каталогов python. Таким образом, я могу смонтировать каталог python-${PYTHON_VERSION} и поместить его куда угодно, и он будет "работать" (при условии, что вы не столкнетесь с libc
или же libm
конфликты). Это также помогает при попытке запустить несколько версий Python на одном компьютере, так как вам не нужно постоянно менять LD_LIBRARY_PATH
или беспокоиться о выборе неверной версии библиотеки Python.
Изменить: Забыл упомянуть, компиляция будет жаловаться, если вы не установите 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 от 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, как показано выше.
Это сработало для меня...
$ sudo apt-get install python2.7-dev
На Солярисе 11
использование LD_LIBRARY_PATH_64
разрешить символическую ссылку на библиотеку Python.
В моем случае для python3.6 LD_LIBRARY_PATH
не работал, но LD_LIBRARY_PATH_64
сделал.
Надеюсь это поможет.
С уважением
Этот ответ будет полезен тем, у кого ограниченный доступ для авторизации на сервере.
У меня была аналогичная проблема на виртуальном хостинге HostGator.
Python3.5
приходилось включать каждый раз после входа в систему. Вот мои 10 шагов к разрешению:
Включите питон через скрипт scl
python_enable_3.5
или жеscl enable rh-python35 bash
.Убедитесь, что он включен, выполнив
python3.5 --version
. Это должно дать вам вашу версию Python.Выполнять
which python3.5
получить свой путь. В моем случае это было/opt/rh/rh-python35/root/usr/bin/python3.5
. Вы можете использовать этот путь, чтобы снова получить версию (просто чтобы убедиться, что этот путь работает для вас).Отлично, теперь, пожалуйста, выйдите из текущей оболочки с помощью.
Теперь давайте снова получим версию через этот полный путь python3.5
/opt/rh/rh-python35/root/usr/bin/python3.5 --version
.Это не даст вам версию, а только ошибку. В моем случае это было
/opt/rh/rh-python35/root/usr/bin/python3.5: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory
Как упоминалось в ответе Тамаса , мы должны найти, что
so
файл.locate
не работает на виртуальном хостинге, и вы не можете его установить.Используйте следующую команду, чтобы найти, где находится этот файл:
find /opt/rh/rh-python35 -name "libpython3.5m.so.rh-python35-1.0"
- Вышеупомянутая команда напечатает полный путь (вторая строка) к файлу после его обнаружения. В моем случае вывод был
find: `/opt/rh/rh-python35/root/root': Permission denied
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
- Вот полная команда для работы python3.5 на таком виртуальном хостинге, которая выдаст версию,
LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5 --version
- Наконец, для краткости добавьте следующий псевдоним в свой ~ / .bashrc
alias python351='LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5'
- Для проверки перезагрузите
.bashrc
кsource ~/.bashrc
и выполнитьpython351 --version
.
Ну вот, теперь, когда вы снова входите в систему, у вас есть
python351
приветствовать вас.
Это не ограничивается
python3.5
, но может быть полезен в случае других
scl
установленное программное обеспечение.
Все, что для этого нужно - это установка файлов libpython [3 или 2] dev.
Я установил с помощью команды:
./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, и он успешно работал.
Просто установите python-lib. (Python27 Пб). Он установит libpython2.7.so1.0. Нам не нужно ничего устанавливать вручную.