Ubuntu9.10: как использовать каталоги lib-dynload и site-packages в python? - PullRequest
2 голосов
/ 14 ноября 2009

В Ubuntu 9.10, в usr / lib / есть каталоги python2.4, python2.5, python2.6 и python3.0

На самом деле работает только python 2.6.
python2.4 имеет только каталог lib-dynload,
В python2.5 есть только lib-dynload и site-packages,
В python3.0 есть только каталог dist-packages.

Теперь мне интересно, какова идея этого? Потому что, когда я устанавливаю python2.5 с ./configure, make, make install | altinstall это идет в usr / local / lib, а не в usr / lib /, так почему эти каталоги были добавлены в ubuntu, как мне установить python для их использования?

Ответы [ 4 ]

2 голосов
/ 14 ноября 2009

j3ll3, в Ubuntu (или любой ОС Linux на базе DPKG) вы можете задать вопрос " Какой пакет предоставляет XYZ", набрав

dpkg -S /path/to/XYZ

Так, например, в Ubuntu 9.10,

dpkg -S /usr/lib/python2.5/lib-dynload/gdbm.so

возвращает

python-gdbm: /usr/lib/python2.5/lib-dynload/gdbm.so

Вы можете узнать больше о пакете python-gdbm, набрав

apt-cache show python-gdbm

, который говорит, что python-gdbm обеспечивает "поддержку базы данных GNU dbm для Python". Возможно, еще интереснее, если вы наберете

dpkg --listfiles python-gdbm

вы увидите список всех файлов, которые устанавливает python-gdbm:

...
/usr/lib/python2.4
/usr/lib/python2.4/lib-dynload
/usr/lib/python2.4/lib-dynload/gdbm.so
/usr/lib/python2.5
/usr/lib/python2.5/lib-dynload
/usr/lib/python2.5/lib-dynload/gdbm.so
/usr/lib/python2.6
/usr/lib/python2.6/lib-dynload
/usr/lib/python2.6/lib-dynload/gdbm.so
...

Похоже, этот пакет устанавливает 3 библиотеки .so, по одной для каждой версии python.

Python2.6 является версией Python по умолчанию в Ubuntu 9.10, но также возможно установить python2.4, 2.5 и / или 3.0. Если вы этого не сделаете, используется только /usr/lib/python2.6/lib-dynload/gdbm.so, остальные просто теряют место.

Поскольку ненужные файлы в python2.4, 2.5, 3.0 не очень велики, разработчик пакета, вероятно, посчитал, что проще было отправить один пакет, чем один для каждой версии python.

Однако, если вы не знаете, как исправить будущие ошибки apt-get, я бы порекомендовал , а не , вручную удаляя любые файлы, установленные пакетами в Ubuntu.

0 голосов
/ 16 ноября 2009

Я не уверен, что вы подразумеваете под "На самом деле работает только python 2.6". Предположим, вы запустили «эмулятор терминала» и получили приглашение командной строки. Это то, что вы имеете в виду:

% python -V
Python 2.6

Другими словами, когда вы запускаете Python, вы получаете версию 2.6? Ну, вы пробовали это:

% python2.4

Если Python 2.4 правильно установлен в вашей системе, он запустится. Аналогично python2.5 будет запускать Python 2.5.

Если они не запускаются, и это то, что вы имели в виду под «Только python 2.6 на самом деле работает», то стоит попробовать убедиться, что у вас действительно установлены пакеты Ubuntu для Python 2.4 и Python 2.5.

% sudo apt-get install python2.4 python2.5

Если они не были установлены ранее, это должно добавить их. Я думаю, что у вас могут быть различные библиотеки для поддержки старых версий Python, но у вас просто нет реальных пакетов Ubuntu для этих старых версий.

0 голосов
/ 14 ноября 2009

Краткий ответ на ваш вопрос: когда вы устанавливаете пакеты из исходного кода, вы должны использовать установщик пакетов setup.py, чтобы установить их автоматически и правильно. Этот установщик уже знает, где правильно установить модули, чтобы Python мог их найти. Чтобы использовать, просто позвоните с точным интерпретатором Python, с которым вы хотите использовать пакет.

Ускоренный курс в setup.py. Сначала запустите его с точным исполняемым файлом Python, для которого вы хотите, чтобы пакет был доступен. Если вы хотите использовать пакет с /usr/bin/python2.5, вы должны использовать /usr/bin/python2.5 для запуска setup.py. Во-вторых, перейдите в каталог, где установлен пакет setup.py. В-третьих, вы должны установить как root, так что проще всего сделать как root. В-четвертых, если вы хотите установить несколько интерпретаторов Python, вы должны запустить setup.py с каждым, но вы должны очистить его между ними. Итак, вот что я бы сделал:

% cd /root/directory/of/untarred/source/package
% sudo su
# /path/to/first/python setup.py build install
# rm -rf build
# /path/to/second/python setup.py build install
# rm -rf build
# exit
%

Если вы устанавливаете модули вручную ... вы не должны, вы должны использовать setup.py. (Если вы написали новый модуль, вы должны написать для него setup.py.) Если вы должны установить вручную, вам необходимо выяснить, какой каталог следует установить для каждого Python. либо путем исследования и эксперимента, либо путем вызова тех же библиотек, которые вызывает установщик, чтобы определить правильный каталог. Установщики, использующие distutils, звонят distutils.sysconfig.get_python_lib(); установщики, использующие setup_tools, ищут в setup_tools.command.easy_install.easy_install.INSTALL_SCHEMES[os.name]["install_dir"].

Относительно dist-packages: У меня был разговор с сопровождающим пакета Python для Debian в начале этого года. Он реализовал это dist-packages в бета-пакетах, собранных в Ubuntu 9.04, но в коде была ошибка PYTHONUSERBASE, которую я опрокинул. Мы немного поговорили. IIRC причина, по которой dist-packages была как-то связана с принуждением пользователя устанавливать пакеты в другой каталог, отличающийся от apt-get . Я, правда, не совсем понимаю мотивацию, потому что на практике и пользователь, и apt-get все еще устанавливаются в один и тот же каталог.

lib-dynload не вещь Debian; это каталог, который сам Python устанавливает. Я считаю, что это был каталог только для разделяемых библиотек, реализующих модули. Я не уверен, что Python все еще использует его.

Наконец, я не знаю, что вы подразумеваете под "только python2.6 на самом деле работает". А как насчет этих каталогов с разными именами "не работает"?

0 голосов
/ 14 ноября 2009

Звучит так, будто они произошли из-за некоторых пакетов, которые вы установили.

Используемая версия Python определяет местоположения, в которых выполняется поиск установленных пакетов / модулей Python, а «системная версия» Python в Ubuntu 9.10 - 2.6, так что это практически все, что следует использовать. Если вам нужно установить пакет python2.5 (или он будет установлен как зависимость от чего-то другого), он будет использовать /usr/lib/python2.5/*. Попробуйте запустить which python и python --version; также which python2.6 и which python2.5.

Из того, что я понимаю, хотя я не совсем уверен, почему вообще, Debian (из которого происходит Ubuntu) использует схему именования dist-packages вместо site-packages.

Терминология: В Python есть пакеты, а в Debian (и так в Ubuntu) есть пакеты. Это не один и тот же пакет, хотя отдельные пакеты Debian будут устанавливать определенные пакеты Python.

...