Миграция в pip + virtualenv из setuptools - PullRequest
13 голосов
/ 13 февраля 2011

Так что pip и virtualenv звучат замечательно по сравнению с setuptools. Возможность удаления была бы великолепна. Но мой проект уже использует setuptools, так как мне перейти? Сайты, которые мне удалось найти, очень расплывчаты и носят общий характер. Итак, вот антология вопросов после прочтения основных веб-сайтов и пробной работы:

  • Прежде всего, virtualenv и pip должны быть в рабочем состоянии? Если нет, пожалуйста, не обращайте внимания на остальных как бред сумасшедшего.
  • Как установить virtualenv? Я не совсем готов поверить, что это так запутанно, как объяснил в другом месте .
  • Существует ли набор проверенных инструкций по установке matplotlib в виртуальной среде? По какой-то причине он всегда хочет скомпилировать его здесь, а не просто устанавливать пакет, и он всегда заканчивается неудачей (даже после build-dep, который занимал 250 МБ дискового пространства). После целого ряда предупреждений он печатает src/mplutils.cpp:17: error: ‘vsprintf’ was not declared in this scope.
  • Как любой инструмент взаимодействует с setup.py? pip должен заменить easy_install, но не ясно, является ли это вставкой или более сложными отношениями.
  • Virtualenv только для режима разработки, или пользователи также должны установить его?
  • Будет ли полученный пакет установлен с минимальными требованиями (например, текущее яйцо) или он будет установлен с исходными кодами и двоичными файлами для всех зависимостей, а также со всеми инструментами сборки, создавая гигабайтного монстра в виртуальной среде?
  • Придется ли пользователям изменять свои $PATH и $PYTHONPATH, чтобы запустить полученный пакет, если он установлен в виртуальной среде?
  • Нужно ли создавать скрипт из текстовой строки для virtualenv, как в старые добрые времена?
  • Что с синтаксисом URL #egg=Package? Это не является частью стандартного URL, так почему же это не отдельный параметр?
  • Где @rev включен в URL? В конце концов, я полагаю, но в документации не ясно об этом («Вы также можете включить @rev в URL»).
  • Что следует понимать, используя существующий файл требований как "как своего рода шаблон для нового файла" ? Это может означать любое количество вещей.

Ответы [ 2 ]

21 голосов
/ 03 марта 2011

Ух ты, это довольно много вопросов. Многие из них действительно заслуживают своего собственного вопроса SO с более подробной информацией. Я сделаю все возможное:

Прежде всего, это virtualenv и pip должен быть в пригодном для использования состоянии сейчас?

Да, хотя они не служат нуждам каждого. Pip и virtualenv (наряду со всем остальным в управлении пакетами Python) далеки от совершенства, но они широко используются и, тем не менее, зависят от них.

Как установить virtualenv? Я не совсем готов поверить, что это так запутанный, как объяснено в другом месте.

Ответ, который вы связываете, сложен, потому что он пытается вообще не вносить каких-либо изменений в вашу глобальную установку Python и вместо этого устанавливает все в ~/.local. Это имеет некоторые преимущества, но сложнее в настройке. Также устанавливается virtualenvwrapper , который представляет собой набор удобных bash-скриптов для работы с virtualenv, но не обязателен для использования virtualenv.

Если вы работаете в Ubuntu, то aptitude install python-setuptools, за которым следует easy_install virtualenv, должны обеспечить вам работающую установку virtualenv без ущерба для вашей глобальной среды python (если только у вас не был установлен пакет Ubuntu virtualenv, который я не рекомендую как это скорее всего будет старая версия).

Есть ли набор проверенных инструкций о том, как установить Matplotlib в виртуальная среда? По какой-то причине он всегда хочет скомпилировать это здесь вместо того, чтобы просто установить пакет, и это всегда заканчивается неудачей (даже после build-dep который занял 250 МБ дискового пространства). После целой связки предупреждения это печатает src / mplutils.cpp: 17: ошибка: vsprintf не был объявлен в этой области.

Он "всегда хочет компилировать", потому что pip по своей природе устанавливается только из исходного кода, он не устанавливает предварительно скомпилированные двоичные файлы. Это спорный выбор и, вероятно, основная причина, по которой pip получил широкое распространение среди веб-разработчиков Python, которые используют более чистые пакеты Python и обычно разрабатывают и внедряют в средах POSIX, где стандартная рабочая цепочка компиляции.

Причиной выбора проекта является то, что обеспечение скомпилированных двоичных файлов имеет проблему комбинаторного взрыва с различными платформами и архитектурами сборок (включая версию Python, сборки UCS-2 и сборки Python UCS-4, 32 против 64-разрядных ...) То, как easy_install находит правильный бинарный пакет в PyPI, работает в большинстве случаев, но не учитывает все эти факторы и может сломаться. Так что pip просто избегает этой проблемы (заменив ее требованием, чтобы у вас была рабочая среда компиляции).

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

Я не знаю, в чем причина вашей ошибки компиляции, она работает для меня (в Ubuntu 10.10) с помощью этой серии команд:

virtualenv --no-site-packages tmp
. tmp/bin/activate
pip install numpy
pip install -f http://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.tar.gz matplotlib

Ссылка "-f" необходима для получения самой последней версии из-за необычных URL-адресов загрузки matplotlib в PyPI .

Как любой инструмент взаимодействует с setup.py? Пипс должен заменить easy_install, но не понятно будь то дроп-ин или больше сложные отношения.

Файл setup.py представляет собой соглашение distutils , «решение» для управления пакетами стандартной библиотеки Python. В одном distutils отсутствуют некоторые ключевые функции, а setuptools - это широко используемый сторонний пакет, который «охватывает и расширяет» distutils для предоставления некоторых дополнительных функций. setuptools также использует setup.py. easy_install - это установщик в комплекте с setuptools. Разработка setuptools остановилась на несколько лет, и Distribu был форком setuptools для исправления некоторых давних ошибок. В конечном итоге ответвление было решено путем объединения дистрибутива обратно в setuptools, и разработка setuptools теперь снова активна (с новым сопровождающим).

distutils2 была в основном переписанной новой версией distutils, которая пыталась включить лучшие идеи из setuptools / distribate, и должна была стать частью стандартной библиотеки Python. К сожалению, эта попытка не удалась, поэтому на данный момент setuptools остается фактическим стандартом для упаковки Python.

Pip заменяет easy_install, но не заменяет setuptools; он требует setuptools и строит поверх него. Таким образом, он также использует setup.py.

Virtualenv только для развития режим, или если пользователи также устанавливают это?

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

Будет ли полученный пакет установлен с минимальным требования (как текущее яйцо), или он будет установлен с источниками и двоичные файлы для всех зависимостей плюс все инструменты сборки, создающие гигабайт монстр в виртуальной среде?

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

Это не связано с вопросом о том, используете ли вы virtualenv. easy_install доступно по умолчанию в virtualenv и прекрасно работает там. Он может устанавливать предварительно скомпилированные бинарные яйца, так же, как и за пределами virtualenv.

Придется ли пользователям изменять свои $ PATH и $ PYTHONPATH для запуска результирующий пакет, если он установлен в виртуальная среда?

Чтобы использовать что-либо, установленное в virtualenv, вам необходимо использовать двоичный файл python в каталоге bin/ virtualenv (или другой скрипт, установленный в virtualenv, который ссылается на этот двоичный файл). Наиболее распространенный способ сделать это - использовать скрипт activate или activate.bat virtualenv, чтобы временно изменить оболочку PATH, чтобы каталог bin/ virtualenv был первым. Изменение PYTHONPATH, как правило, не является полезным или необходимым с помощью virtualenv.

Нужно ли создавать скрипт из текстовая строка для virtualenv, как в плохие старые времена?

номер

Что такое с # egg = Package URL синтаксис? Это не часть стандартный URL, так почему бы не отдельный параметр?

Взлом фрагмента URL "# egg = projectname-version" был впервые , введенным setuptools и easy_install . Так как easy_install очищает ссылки из Интернета, чтобы найти возможные дистрибутивы для установки для заданного имени и версии пакета, этот хак позволил авторам пакетов добавлять ссылки на PyPI, которые easy_install мог понять, даже если они не использовали стандартные соглашения об именах easy_install для своих файлов .

Где @rev включен в URL? В конец, я полагаю, но документация не ясно об этом («Вы также можете включить @rev в URL ").

Через пару предложений после этого цитируемого фрагмента есть ссылка на «прочитайте формат файла требований , чтобы узнать о других функциях».Функция @rev полностью документирована и продемонстрирована там.

Что следует понимать при использовании существующего файла требований как «в качестве шаблона для нового файла»?Это может означать любое количество вещей.

В самом следующем предложении говорится, что «оно будет содержать в порядке пакеты, перечисленные в devel-req.txt, и сохранит комментарии».Я не уверен, что было бы лучшим кратким описанием.

4 голосов
/ 13 февраля 2011

Я не могу ответить на все ваши вопросы, но, надеюсь, поможет следующее.

Оба virtualenv и pip очень удобны в использовании. Многие разработчики Python используют их каждый день.

Поскольку у вас есть работающая программа easy_install, самый простой способ установить оба варианта:

easy_install pip
easy_install virtualenv

Как только у вас появится virtualenv, просто наберите virtualenv yourEnvName, и вы получите новую виртуальную среду python в каталоге с именем yourEnvName.

Оттуда это так же просто, как и source yourEnvName/bin/activate, и виртуальный интерпретатор Python станет вашим активом. Я ничего не знаю о matplotlib, но после инсталляционных взаимодействий все должно работать нормально, если только нет странных жестко запрограммированных проблем с путями.

Если вы можете установить что-то через easy_install, вы обычно можете установить это через pip. Я не нашел ничего, что easy_install могло бы сделать, что pip не смогло бы.

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

Если вы или пользователь устанавливаете что-либо в virtualenv, оно не будет доступно в других virtualenvs или системном интерпретаторе Python. Вам нужно будет использовать команду source /path/to/yourvirtualenv/bin/activate для переключения на виртуальную среду, в которой вы установили библиотеку.

Что они подразумевают под «как своего рода шаблон для нового файла», так это то, что команда pip freeze -r devel-req.txt > stable-req.txt создаст новый файл stable-req.txt на основе существующего файла devel-req.txt. Единственным отличием будет то, что все, что установлено, но не указано в существующем файле, будет в новом файле.

...