PyPI работает медленно. Как мне запустить свой собственный сервер?

Когда к команде присоединяется новый разработчик или Дженкинс запускает полную сборку, мне нужно создать новую виртуальную среду. Я часто обнаруживаю, что настройка virtualenv с Pip и большим количеством (более 10) требований занимает очень много времени, чтобы установить все из PyPI. Часто он вообще выходит из строя с:

Downloading/unpacking Django==1.4.5 (from -r requirements.pip (line 1))
Exception:
Traceback (most recent call last):
  File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/basecommand.py", line 107, in main
    status = self.run(options, args)
  File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/commands/install.py", line 256, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
  File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1018, in prepare_files
    self.unpack_url(url, location, self.is_download)
  File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1142, in unpack_url
    retval = unpack_http_url(link, location, self.download_cache, self.download_dir)
  File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 463, in unpack_http_url
    download_hash = _download_url(resp, link, temp_location)
  File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 380, in _download_url
    chunk = resp.read(4096)
  File "/usr/lib64/python2.6/socket.py", line 353, in read
    data = self._sock.recv(left)
  File "/usr/lib64/python2.6/httplib.py", line 538, in read
    s = self.fp.read(amt)
  File "/usr/lib64/python2.6/socket.py", line 353, in read
    data = self._sock.recv(left)
timeout: timed out

Я знаю о флаге --use-mirrors Пипа, и иногда люди в моей команде работали, используя --index-url http://f.pypi.python.org/simple (или другое зеркало), пока у них не было зеркала, которое своевременно отвечает. Мы находимся в Великобритании, но в Германии есть зеркало PyPI, и у нас нет проблем с загрузкой данных с других сайтов.

Итак, я ищу способы внутреннего зеркалирования PyPI для нашей команды.

Варианты, которые я рассматривал, следующие:

  1. Запуск собственного экземпляра PyPI. Существует официальная реализация PyPI: CheeseShop, а также несколько сторонних реализаций, таких как: djangopypi и pypiserver (см. сноску)

    Проблема с этим подходом заключается в том, что меня не интересует полная функциональность PyPI с загрузкой файлов, я просто хочу отразить контент, который он предоставляет.

  2. Запуск зеркала PyPI с помощью pep381client или pypi-зеркало.

    Похоже, это может сработать, но для этого требуется, чтобы мое зеркало сначала загрузило все из PyPI. Я установил тестовый экземпляр pep381client, но моя скорость загрузки колеблется от 5 до 200 Кбит/с (бит, а не байт). Если где-то нет копии полного архива PyPI, мне потребуются недели, чтобы получить полезное зеркало.

  3. Использование циклического прокси-сервера PyPI, такого как yopypi.

    Это не имеет значения, поскольку http://pypi.python.org сам состоит из несколько географически разных серверов.

  4. Копирование виртуальной среды между разработчиками или размещение папки текущего проекта зависимости.

    Это не масштабируется: у нас есть несколько разных проектов Python, зависимости которых меняются (медленно) с течением времени. Как только зависимости любого проекта изменятся, эта центральная папка должна быть обновлена, чтобы добавить новые зависимости. Однако копирование virtualenv хуже, чем копирование пакетов, поскольку любые пакеты Python с модулями C необходимо скомпилировать для целевой системы. В нашей команде есть пользователи как Linux, так и OS X.

    (Это по-прежнему выглядит как лучший вариант плохой группы.)

  5. Использование интеллектуального кэширующего прокси-сервера PyPI: collective.eggproxy

    Кажется, это было бы очень хорошим решением, но последняя версия PyPI датирована 2009 годом и обсуждает mod_python.

Чем занимаются другие крупные команды Python? Какое лучшее решение для быстрой установки одного и того же набора пакетов Python?

Сноски:


person Wilfred Hughes    schedule 21.03.2013    source источник
comment
Лично я был в ситуации, когда мне нужно было написать сценарий (повторяющегося) создания virtualenv, я просто создал файлы .egg для нужных мне пакетов и проверил их в репозитории вместе со сценарием для создания virtualenv. Однако я не претендую на то, чтобы быть частью большой команды Python.   -  person FatalError    schedule 21.03.2013


Ответы (5)


У вас есть общая файловая система?

Потому что я бы использовал настройку кеша pip. Это довольно просто. Например, создайте папку с именем pip-cache в /mnt.

mkdir /mnt/pip-cache

Затем каждый разработчик поместит следующую строку в свою конфигурацию pip (unix = $HOME/.pip/pip.conf, win = %HOME%\pip\pip.ini)

[global]
download-cache = /mnt/pip-cache

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

person aychedee    schedule 21.03.2013
comment
Это кажется фантастическим вариантом. Однако ваш пример pip.conf неверен - не должно быть отступа, иначе Пип умрет с ConfigParser.ParsingError: File contains parsing errors. Я бы отредактировал его сам, но SO не позволяет мне вносить небольшие изменения. - person Wilfred Hughes; 22.03.2013
comment
Я проверил это, и это работает отлично. Хотел бы я больше голосовать за вас, спасибо. Престижность за то, что вы не просто рассматриваете лучший способ запуска сервера. - person Wilfred Hughes; 22.03.2013
comment
Мы решили копировать кешированные пакеты Pip с сервера сборки внутри команды: gist.github.com/Wilfred. /5221953 - person Wilfred Hughes; 22.03.2013
comment
pip также имеет параметр командной строки --download-cache=‹dir›, поэтому вам не нужно редактировать конфигурацию, если это проще - person dalore; 25.09.2013

Хотя это не решает вашу проблему с PyPI, передачу созданных виртуальных окружений разработчикам (или развертываниям) можно выполнить с помощью Terrarium..

Используйте террариум, чтобы упаковать, сжать и сохранить виртуальные окружения. Вы можете хранить их локально или даже на S3. Из документации на GitHub:

$ pip install terrarium
$ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt

После создания новой среды террариум заархивирует и сожмет среду, а затем скопирует ее в место, указанное в storage-dir.

При последующих установках для того же набора требований, в котором указан тот же каталог-хранилище, terrarium будет копировать и извлекать сжатый архив из /mnt/storage.

Чтобы отобразить, как именно террариум будет называть архив, вы можете запустить следующую команду:

$ terrarium key requirements.txt more_requirements.txt
x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1
person Kyle Kelley    schedule 04.04.2013
comment
Спасибо, я не знал о террариуме. Обрабатывает ли он случай совместного использования между пользователями OS X и Linux? У нас есть модули как на чистом Python, так и на C, поэтому я сомневаюсь, что скомпилированные пакеты будут кроссплатформенными. - person Wilfred Hughes; 04.04.2013
comment
Я действительно хотел бы знать. :( У меня нет Mac (хотя я бы хотел его иметь...) Если у меня будет шанс, я посмотрю, что смогу выяснить. Я начал использовать этот пакет только после PyCon 2013 (слышал об этом и встретил там разработчика). - person Kyle Kelley; 04.04.2013
comment
Автор террариума здесь. Скомпилированные пакеты не будут кроссплатформенными, террариум не решит эту проблему. Если ваши требования не меняются так часто, это просто означает, что первый пользователь каждого типа платформы, который запускает команду, будет сборщиком. Все последующие исполнители команд (до другого изменения требований) будут удалять предварительно созданную версию. Похоже, террариум будет простым в использовании командным интерфейсом для того, что вы уже пытаетесь сделать вручную. Если вы столкнетесь с какими-либо проблемами, которые мешают вам использовать его таким образом, дайте мне знать. - person Kyle Gibson; 04.04.2013

Недавно я установил devpi в конфигурацию Vagrant моей команды разработчиков, так что его кеш пакетов живет файловая система хоста. Это позволяет каждой виртуальной машине иметь свой собственный демон devpi-server, который она использует в качестве index-url для virtualenv/pip. Когда виртуальные машины уничтожаются и повторно инициализируются, пакеты не нужно загружать снова и снова. Каждый разработчик загружает их один раз, чтобы создать свой локальный кеш, пока они находятся в файловой системе хоста.

У нас также есть внутренний индекс PyPi для наших частных пакетов, который в настоящее время представляет собой просто каталог, обслуживаемый Apache. В конечном счете, я собираюсь преобразовать его в прокси-сервер devpi, чтобы наш сервер сборки также поддерживал кеш пакетов для наших зависимостей Python в дополнение к размещению наших частных библиотек. Это создаст дополнительный буфер между нашей средой разработки, производственными развертываниями и общедоступным PyPi.

Это, кажется, самое надежное решение, которое я нашел для этих требований на сегодняшний день.

person Joe Holloway    schedule 28.01.2014
comment
Я некоторое время искал личные / частные серверы pypi и должен подтвердить, что devpi кажется лучшим из них. Автор devpi также является автором pytest и tox, поэтому ожидайте найти очень хорошую поддержку для разработки и тестирования. - person Jan Vlcinsky; 01.03.2015

Взгляните на pip2pi Дэвида Уолевера. Вы можете просто настроить задание cron, чтобы сохранить зеркало пакетов, которые вам нужны, для всей компании или команды, а затем направить свои точки на свое внутреннее зеркало.

person gotgenes    schedule 25.04.2013

Настройте свой локальный сервер, затем измените файл hosts на локальном компьютере, чтобы перезаписать фактический URL-адрес, чтобы он вместо этого указывал на локальный сервер, пропуская стандартный DNS. Затем удалите строку в файле хоста, если вы закончили.

Или я полагаю, вы могли бы найти URL-адрес в pip и изменить его.

person user2197172    schedule 21.03.2013