Миграция в pip + virtualenv из setuptools

So 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 для запуска результирующего пакета, если он установлен в виртуальной среде?
  • Нужно ли мне создать script из текстовой строки для virtualenv как в плохие старые дни?
  • Что такое синтаксис URL #egg=Package? Это не часть стандартного URL, так почему же это не отдельный параметр?
  • Где @rev включен в URL? В конце я предполагаю, но документация не совсем понятна об этом ( "Вы также можете включить @rev в URL" ).
  • Что должно быть понято с помощью существующего файла требований как "как своего рода шаблон для нового файла" ? Это может означать любое количество вещей.

Ответы

Ответ 1

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

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

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

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

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

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

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

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

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

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

Я не знаю, что вызывает вашу ошибку компиляции, она работает для меня (на 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" необходима, чтобы получить самую последнюю версию из-за matplotlib необычных URL загрузки в PyPI.

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

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

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

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

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

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

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

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

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

Пользователь должен будет изменить свои $PATH и $PYTHONPATH для запуска если он установлен в виртуальная среда?

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

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

Нет.

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

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

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

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

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

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

Ответ 2

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

Оба 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. Единственное различие будет в том, что все, что установлено, уже не указано в существующем файле, будет в новом файле.