Как поддерживать долгоживущие проекты python w.r.t. зависимостей и версий python?

короткая версия: как я могу избавиться от кошмара с несколькими версиями на питоне?

длинная версия: с годами я использовал несколько версий python, а что еще хуже, несколько расширений для python (например, pygame, pylab, wxPython...). Каждый раз, когда он находился на другой установке, с разными ОС, иногда с разными архитектурами (например, с моим старым Mac PowerPC).

В настоящее время я использую mac (OSX 10.6 на x86-64), и это кошмар зависимости каждый раз, когда я хочу оживить script старше нескольких месяцев. Сам Python уже присутствует в трех разных вариантах в /usr/bin (2.5, 2.6, 3.1), но мне пришлось установить 2.4 из macports для pygame, что-то еще (не помню, что) заставило меня установить все три других из macports, поэтому в конце дня я счастливый обладатель семи (!) экземпляров python в своей системе.

Но это не проблема, проблема в том, что ни один из них не имеет права (то есть множество установленных) библиотек, некоторые из них - 32 бита, некоторые 64 бита, и теперь я довольно сильно потерял.

Например, прямо сейчас я пытаюсь запустить трехлетний script (не написанный мной), который использовал для использования matplotlib/numpy для рисования графика в реальном времени в прямоугольнике окна wxwidgets. Но я терпеть неудачу: py26-wxpython из macports не будет установлен, у python на складе есть wxwidgets, но также имеет некоторый конфликт между 32 битами и 64 битами, и у него нет numpy... какой беспорядок!

Очевидно, что я делаю неправильно. Как вы обычно справляетесь со всем этим хаосом?

Ответ 1

Некоторые советы:

  • в Mac OS X используйте только установку python в /Library/Frameworks/Python.framework.
  • всякий раз, когда вы используете numpy/scipy/matplotlib, установите дистрибутив python с enthought.
  • используйте virtualenv и virtualenvwrapper, чтобы сохранить эти "системные" установки нетронутыми; в идеале использовать одну виртуальную среду для каждого проекта, поэтому выполняются все зависимости проекта. И, да, это означает, что потенциально много кода будет реплицироваться в различных виртуальных envs.

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

Ответ 2

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

virtualenv my_env

Это создает новое бинарное и библиотечное расположение python и символические ссылки на существующие системные библиотеки по умолчанию. Затем, чтобы переключить пути для использования новой среды, вы делаете это:

source my_env/bin/activate

Что это. Теперь, если вы устанавливаете модули (например, с помощью easy_install), они устанавливаются в каталог lib каталога my_env. Они не мешают существующим библиотекам, вы не получаете странных конфликтов, вещи не перестают работать в вашей старой среде. Они полностью изолированы.

Чтобы выйти из среды, просто сделайте

deactivate

Если вы решите, что сделали ошибку с установкой или больше не хотите эту среду, просто удалите каталог:

rm -rf my_env

И все готово. Это действительно так просто.

virtualenv отлично.;)

Ответ 3

Взгляните на virtualenv.

Ответ 4

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

В большинстве случаев сам код Python может быть передан как есть с небольшими необходимыми изменениями.

Моя самая большая работа проекта @python (15.000+ LOC) теперь находится на Python 2.6 через несколько месяцев (обновление всего из Python 2.5 заняло большую часть дня из-за установки/проверки 10+ зависимостей...)

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

Ответ 5

  • установите версии python, которые вам нужны, лучше, если из источников
  • когда вы пишете script, включите в него полную версию python (например, #!/usr/local/bin/python2.6)

Я не вижу, что может пойти не так.

Если что-то делает, это, вероятно, все равно приведет к отказу в копировании, а не к вашей (одна из причин, по которой я больше не использую macports).

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

Ответ 6

Я использую версию MacPorts для всего, но, как вы заметили, многие версии по умолчанию необычно стары. Например, vim omnicomplete в Snow Leopard имеет python25 как зависимость. Многие порты, связанные с python, имеют старые зависимости, но обычно вы можете указывать новую версию во время сборки, например port install vim +python26 вместо port install vim +python. Сделайте сухой прогон перед установкой чего-либо, чтобы увидеть, если вы тянете, например, весь python24, когда это не является необходимым. Регулярно проверяйте portfiles, потому что соглашение об именах как порты Дарвина выходит из-под земли, оставляя желать лучшего. На практике я просто оставляю все в папках по умолчанию /opt... MacPorts, включая копию всей структуры с дубликатами PyObjC и т.д., И просто придерживаюсь одной версии за раз, сохраняя возможность возврата к системному умолчанию если что-то неожиданно ломается. Это, возможно, слишком много работы, чтобы избежать использования virtualenv, о котором я хотел бы поговорить.

Ответ 7

Мне повезло с помощью Buildout. Вы создали список яиц и какие версии вы хотите. Buildout затем загружает и устанавливает для вас частные версии. Он создает частный двоичный код "python" со всеми уже установленными яйцами. Локальные "nosetests" упрощают отладку. Вы можете расширить сборку своими собственными функциями.

С другой стороны, Buildout может быть довольно загадочным. Сделайте "buildout -vvvv" какое-то время, чтобы увидеть, что именно он делает и почему.

http://www.buildout.org/docs/tutorial.html

Ответ 8

Как минимум в Linux, несколько питонов могут сосуществовать довольно счастливо. Я использую Python 2.6 в системе CentOS, для которой Python 2.4 требуется по умолчанию для различных системных вещей. Я просто скомпилировал и установил python 2.6 в отдельное дерево каталогов (и добавил соответствующий каталог bin на мой путь), который был довольно безболезненным. Затем он вызывается путем ввода "python2.6".

Как только вы запускаете и запускаете отдельные питоны, установка библиотек для конкретной версии проста. Если вы вызываете setup.py script с помощью python, который вы хотите, он будет установлен в каталогах, соответствующих этому питону, и скрипты будут установлены в том же каталоге, что и сам исполняемый файл python, и будут автоматически использовать правильный питон при вызове.

Я также стараюсь избегать использования слишком большого количества библиотек. Когда мне нужна только одна или две функции из библиотеки (например, scipy), я часто вижу, могу ли я просто скопировать их в свой собственный проект.