Ответ 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
-
virtualenv
(иvirtualenvwrapper
)
Вышеупомянутые инструменты используются для автоматизации и управления зависимостями для проекта 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
, которые будут добавлены в путь.