Подтвердить что ты не робот

Можем ли мы пролить некоторый окончательный взгляд на то, как работает упаковка и импорт python?

У меня был мой шанс пройти через управление модулями python, и каждый раз это проблема: упаковка - это не то, что люди делают каждый день, и это становится бременем для изучения и бременем для запоминания, даже когда вы на самом деле, так как это происходит обычно один раз.

Я хотел бы получить здесь окончательный обзор того, как импорт, управление пакетами и дистрибуция работают на python, так что этот вопрос становится окончательным объяснением всей магии, которая происходит под капотом. Хотя я понимаю широкий уровень вопроса, эти вещи настолько переплетаются, что любой сфокусированный ответ не решает главной проблемы: понять, как все работает, что устарело, то, что является текущим, что является просто альтернативой для одной и той же задачи, что причуды.

Список ключевых слов, на которые нужно ссылаться, следующий, но это всего лишь образец из группы. Там гораздо больше, и вы можете добавить дополнительные сведения.

  • PyPI
  • setuptools/Распространение
  • Distutils
  • яйца
  • яичного ссылка
  • пип
  • Zipimport
  • site.py
  • сайт-пакеты
  • .pth файлы
  • virtualenv
  • обработка скомпилированных модулей в яйцах (с установкой и без установки через easy_install)
  • использование get_data()
  • pypm
  • bento
  • PEP 376
  • магазин сыров
  • eggsecutable

Ссылка на другие ответы, вероятно, хорошая идея. Как я уже сказал, этот вопрос предназначен для обзора на высоком уровне.

4b9b3361

Ответ 1

По большей части это попытка взглянуть на сторону упаковки/распространения, а не на механику import. К сожалению, упаковка - это место, где Python предоставляет способы более чем один способ сделать это. Я просто пытаюсь заставить мяч двигаться, надеюсь, что другие помогут заполнить то, что я пропущу, или указать на ошибки.

Прежде всего, здесь есть какая-то грязная терминология. Каталог, содержащий файл __init__.py, представляет собой пакет. Тем не менее, большинство из того, что мы говорим здесь, это конкретные версии пакетов, опубликованные в PyPI, один из них - зеркало или в конкретной системе управления пакетами, такой как Debian Apt, Redhat Yum, Fink, Macports, Homebrew или ActiveState pypm.

Эти опубликованные пакеты - это то, что люди пытаются назвать "Распределениями" в будущем, пытаясь использовать "Пакет" только как конструкцию языка Python. Вы можете увидеть некоторые из этих применений в PEP-376 PEP-376.

Теперь ваш список ключевых слов относится к нескольким различным аспектам экосистемы Python:

Поиск и публикация дистрибутивов python:

  • PyPI (также известный как магазин сыров)
  • Зеркала PyPI
  • Различные инструменты/системы управления пакетами: apt, yum, fink, macports, homebrew
  • pypm (альтернатива ActiveState для PyPI)

Вышеупомянутые - все службы, которые предоставляют место для публикации дистрибутивов Python в различных форматах. Некоторые, такие как зеркала PyPI и репозитории apt/yum, могут запускаться на вашем локальном компьютере или в сети ваших компаний, но люди обычно используют официальные. Большинство, если не все, предоставляют инструмент (или несколько инструментов в случае PyPI), чтобы помочь найти и загрузить дистрибутивы.

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

  • setuptools/Распространение
  • distutils

Distutils - это стандартная инфраструктура, на которой пакеты Python скомпилированы и встроены в дистрибутивы. Там тонна функциональности в distutils, но большинство людей просто знают:

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='[email protected]',
      url='http://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
 )

И в некоторой степени это то, что вам нужно. С помощью 9 строк кода у вас достаточно информации для установки чистого пакета Python, а также минимальных метаданных, необходимых для публикации этого пакета в дистрибутиве PyPI.

Setuptools предоставляет крючки, необходимые для поддержки формата Egg и всех его функций и недостатков. Distribute - это альтернатива Setuptools, которая добавляет некоторые функции, пытаясь быть в основном обратной совместимостью. Я считаю, что Distribute будет включен в Python 3 как преемник Distutil from distutils.core import setup.

Оба Setuptools и Distribute предоставляют пользовательскую версию команды настройки distutils что делает полезные вещи, такие как поддержка формата Egg.

Форматы распространения Python:

  • Источник
  • eggs

Распространения обычно предоставляются либо как исходные архивы (tarball или zipfile). Стандартный способ установки исходного дистрибутива - загрузить и распаковать архив, а затем запустить setup.py файл внутри.

Например, следующая загрузка, сборка и установка библиотеки подсветки синтаксиса Pyigs:

curl -O -G http://pypi.python.org/packages/source/P/Pygments/Pygments-1.4.tar.gz
tar -zxvf Pygments-1.4.tar.gz
cd Pygments-1.4
python setup.py build
sudo python setup.py install

В качестве альтернативы вы можете загрузить файл Egg и установить его. Обычно это выполняется с помощью easy_install или pip:

sudo easy_install pygments
or 
sudo pip install pygments

eggs были вдохновлены Java Jarfiles, и у них есть довольно много функций, которые вы должны прочитать о здесь

Форматы пакетов Python:

  • несжатые каталоги
  • zipimport (zip сжатые каталоги)

Обычный пакет python - это просто каталог, содержащий файл __init__.py и произвольное количество дополнительных модулей или подпакетов. Python также поддерживает поиск и загрузку исходного кода в *.zip файлы, если они включены в PYTHONPATH (sys.path).

Установка пакетов Python:

  • easy_install: оригинальный инструмент для установки яиц, зависит от setuptools
  • pip: в настоящее время самый популярный способ установки пакетов python. Подобно easy_install, но более гибкая и имеет некоторые приятные функции, такие как файлы требований, которые помогают документировать зависимости и воспроизводить развертывания.
  • pypm, apt, yum, fink и т.д.

Управление средой/автоматическое развертывание:

  • bento
  • buildout
  • virtualenvvirtualenvwrapper)

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

Расположение пакетов/распределений:

  • сайт-пакеты
  • PYTHONPATH
  • текущий рабочий каталог (зависит от настроек вашей ОС и среды)

По умолчанию установка дистрибутива python собирается удалить его в каталог сайтов-пакетов. Этот каталог обычно похож на /usr/lib/pythonX.Y/site-packages.

Простой программный способ найти каталог ваших сайтов:

from distuils import sysconfig
print sysconfig.get_python_lib()

Способы изменения PYTHONPATH:

Оператор импорта Python будет находить пакеты, которые находятся в одном из каталогов, включенных в ваш PYTHONPATH.

Вы можете проверить и изменить свой путь из Python, обратившись к:

import sys
print sys.path
sys.path.append("/home/myname/lib")

Кроме того, вы можете установить переменную среды PYTHONPATH, как и любую другую переменную среды в вашей ОС, или вы можете использовать:

  • .pth файлы: *.pth файлы, находящиеся в каталогах, которые уже находятся на вашем PYTHONPATH, читаются, и каждая строка файла *.pth добавляется в ваш PYTHONPATH. В принципе, в любое время, когда вы скопировали пакет в каталог на PYTHONPATH, вы могли бы создать mypackages.pth. Подробнее о файлах *.pth: модуль сайта
  • Файлы с яйцами: Внутренняя структура яиц python, они являются альтернативой альтернативным символическим ссылкам. Создание файла ссылки на яйца аналогично созданию файла pth.
  • site.py изменения

Чтобы добавить выше /home/myname/lib к сайтам-пакетам с *.pth файлом, вы должны создать *.pth файл. Имя файла не имеет значения, но вы все равно должны выбрать что-то разумное.

Создайте myname.pth:

# myname.pth
/home/myname/lib

Что это. Поместите это в sysconfig.get_python_lib() в вашу систему или в любой другой каталог из ваших PYTHONPATH и /home/myname/lib, которые будут добавлены в путь.

Ответ 4

Я не думаю, что import нужно изучить (Python namespacing и importing функциональность интуитивно понятна IMHO).

Я использую pip только сейчас. Я не сталкивался с какими-либо проблемами.

Тем не менее, тема упаковки и распространения - это то, что стоит изучить. Вместо того, чтобы дать длинный ответ, я скажу это:

Я узнал, как упаковывать и распространять мои собственные "пакеты", просто копируя, как это делают Pylons или многие другие пакеты с открытым исходным кодом. Затем я объединил этот тип шаблона с чтением документов, чтобы его еще больше реализовать и придумал надежный метод распространения.

Когда вы grok управления пакетами и дистрибутивами для python (distutils и pypi), он действительно достаточно мощный. Мне это очень нравится.

[править]

Я также хотел немного добавить о virtualenv. ИСПОЛЬЗУЙ ЭТО. Я создаю virtualenv для каждого проекта, и я всегда использую --no-site-packages; Я устанавливаю все пакеты, которые мне нужны для этого конкретного проекта (даже если это что-то общее среди всех, например lxml) внутри virtualev. Он держит все изолированным, и мне гораздо легче поддерживать группировку в голове (вместо того, чтобы пытаться отслеживать, где и для какой версии python!)

[/править]