В чем разница между dist-пакетами и site-пакетами?

Я немного раздражен процессом установки пакета python. В частности, в чем разница между пакетами, установленными в каталоге dist-packages и каталоге site-packages?

3 ответа

Решение

dist-packages - это специфичное для Debian соглашение, которое также присутствует в его производных, таких как Ubuntu. Модули устанавливаются в dist-пакеты, когда они приходят из диспетчера пакетов Debian в это место:

/usr/lib/python2.7/dist-packages

поскольку easy_install а также pip устанавливаются из менеджера пакетов, они также используют dist-пакеты, но они помещают пакеты сюда:

/usr/local/lib/python2.7/dist-packages

Из вики Debian Python:

dist-пакеты вместо site-пакетов. Стороннее программное обеспечение Python, установленное из пакетов Debian, входит в dist-пакеты, а не в пакеты site. Это должно уменьшить конфликт между системным Python и любой сборкой Python из исходного кода, которую вы можете установить вручную.

Это означает, что если вы вручную устанавливаете Python из исходного кода, он использует каталог site-packages. Это позволяет вам хранить две установки отдельно, тем более что Debian и Ubuntu полагаются на системную версию Python для многих системных утилит.

Debian (и Ubuntu) ввели собственное соглашение

      # python3 -m site

на Ubuntu Focal дает

      sys.path = [
    '/qpid-dispatch',
    '/usr/lib/python38.zip',
    '/usr/lib/python3.8',
    '/usr/lib/python3.8/lib-dynload',
    '/usr/local/lib/python3.8/dist-packages',
    '/usr/lib/python3/dist-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.8/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

Соглашение, как описано в связанном списке рассылки, заключается в том, что пакеты python deb, установленные менеджером пакетов дистрибутива, переходят в /usr/lib/python3/dist-packagesи пакеты, установленные с помощью sudo pip3войти в /usr/local/lib/python3.8/dist-packages.

Если вы скомпилируете и установите свой собственный интерпретатор Python, он по умолчанию поместит себя в /usr/local, с установками в /usr/local/lib/pythonX.Y/site-packages.

Смысл соглашения Debian состоит в том, чтобы разделить три набора пакетов:

  1. пакеты python, установленные apt
  2. пакеты, установленные пользователем root с /usr/bin/pip3
  3. пакеты, установленные пользователем root со своими собственными /usr/local/bin/pip3

Мое решение проблемы состоит в том, чтобы сделать dist-packages символическая ссылка на site-packages:

for d in $(find $WORKON_HOME -type d -name dist-packages); do
  pushd $d
  cd ..
  if test -d dist-packages/__pycache__; then
    mv -v dist-packages/__pycache__/* site-packages/__pycache__/
    rmdir -v dist-packages/__pycache__
  fi
  mv -v dist-packages/* site-packages/
  rmdir -v dist-packages
  ln -sv site-packages dist-packages
  popd
done

(если вы не используете инструменты GNU, удалите -v опция).

Другие вопросы по тегам