Проблемы при установке Python 3 с --enable-shared

проблема

Я пытаюсь установить Python 3 с опцией --enable-shared. Установка "успешно", но полученный Python не работает. Попытка запустить Python после установки приводит к следующей ошибке:

$ /opt/python3/bin/python3.5
/opt/python3/bin/python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory
Фон

Операционная система Debian (squeeze) и имеет предыдущую установку Python 2.6, которую необходимо сохранить, потому что другой код полагается на нее, и Apache 2.2. В конечном итоге я пытаюсь настроить Django для работы на Apache, то есть я пытаюсь установить mod_wsgi (или mod_wsgi-express), для которого требуются разделяемые библиотеки. Я уже пытался установить mod_wsgiбез с помощью--enable-shared в установке Python, и получили ... ну, то же самое, но на этот раз из установщика mod_wsgi (и изpip install mod_wsgiчто я тоже попробовал)/opt/python3/bin/python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory.

след

Начиная с установки, как описано вФон выше, вот минимальный список команд, которые я выполнил, которые производят ошибку выше (с удаленным многословием).

[email protected]:~$ wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
[email protected]:~$ tar -zxvf Python-3.5.1.tgz
[email protected]:~$ cd Python-3.5.1
[email protected]:~/Python-3.5.1$ ./configure --prefix=/opt/python3 --enable-shared
[email protected]:~/Python-3.5.1$ make && sudo make install
(... appears to install correctly)

[email protected]:~/Python-3.5.1$ /opt/python3/bin/python3.5
/opt/python3/bin/python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory

Я также попробовал это сLD_RUN_PATH установить, как описано в решении этогодругой вопросс теми же результатами:

[email protected]:~/Python-3.5.1$ sudo make distclean
[email protected]:~/Python-3.5.1$ ./configure --prefix=/opt/python3 --enable-shared
[email protected]:~/Python-3.5.1$ LD_RUN_PATH=/usr/local/lib make
[email protected]:~/Python-3.5.1$ sudo make install
[email protected]:~/Python-3.5.1$ /opt/python3/bin/python3.5
/opt/python3/bin/python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory

Я также пробовал это с Python 3.4, с теми же результатами. Я не пробовал это с Python 2, потому что я не хочу, чтобы будущие разработки были ограничены Python 2.7 (поэтому даже успешная установка не будет отвечать моим требованиям). Я также предполагаю, что попытка не предоставит никакой новой или полезной информации.

 user210082612 июн. 2016 г., 13:46
Я пытаюсь убедиться, что он использует общие библиотеки. Есть ли способ сделать это с помощью apt-get?
 user202720282710 июн. 2016 г., 23:25
Почему бы не установить его из репозитория? apt-get установить python3

Ответы на вопрос(2)

Как объяснено в документации mod_wsgi, установитеLD_RUN_PATH во время установки mod_wsgi.

http://modwsgi.readthedocs.io/en/develop/user-guides/installation-issues.html?highlight=ld_run_path#unable-to-find-python-shared-library
 Graham Dumpleton12 июн. 2016 г., 23:03
Иди читайblog.dscpl.com.au/2015/06/... Не обращайте внимания на то, что там написано Docker, все еще актуально.
 user210082612 июн. 2016 г., 13:50
Спасибо, Грэм. Возможно, я не должен был помечать этот mod-wsgi, потому что проблема происходит на этапе установки Python, прежде чем я даже приступлю к установке mod-wsgi. Я буду иметь это в виду, когда я это сделаю.
Решение Вопроса

Я повторил ваши шаги на CentOS7 и получил нечто подобное:

$ /tmp/py3/bin/python3
/tmp/py3/bin/python3: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory

Если вы посмотрите на ссылку Python, он не предоставляет полный путь к библиотеке:

$ ldd /tmp/py3/bin/python3
    linux-vdso.so.1 =>  (0x00007fff47ba5000)
    libpython3.5m.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdfaa32e000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fdfaa12a000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007fdfa9f27000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fdfa9c24000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fdfa9862000)
    /lib64/ld-linux-x86-64.so.2 (0x000055e85eac5000)

По какой-то причине процесс сборки Python не добавляет-rpath к строке ссылки, которая «добавит каталог в путь поиска библиотеки времени выполнения».

Если вы явно указали путь к своей библиотеке, он будет работать:

$ LD_LIBRARY_PATH=/tmp/py3/lib/ /tmp/py3/bin/python3
Python 3.5.1 (default, Jun 10 2016, 14:54:59) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Так что теперь возникает вопрос, хотите ли вы:

задаватьLD_LIBRARY_PATH глобально в вашей системередактировать/etc/ld.so.conf (или же/etc/ld.so.conf.d/*)использованиеchrpath изменить встроенный путьexport LD_RUN_PATH={prefix}/lib прежде чем бежатьconfigure а такжеmake (Куда{prefix} это то, что вы перешли на--prefix, Вы использовали неправильный путь.)
 Rafa11 июн. 2016 г., 20:22
Что касается последнего варианта, вы также можете передать флаги загрузчика./configure, Например:./configure --prefix=/opt/python3 --enable-shared LDFLAGS="-Wl,-rpath /opt/python3".
 user210082612 июн. 2016 г., 14:03
Спасибо @rrauenza! Часть, которую я пропустил, заключалась в том, чтоLD_RUN_PATH относится к--prefix, не абсолютное / стандартное местоположение.

Ваш ответ на вопрос