Как установить пакеты distutils с помощью apu distutils или api setuptools - PullRequest
2 голосов
/ 14 сентября 2009

Я работаю над сценарием сборки, который должен установить пакет distutils на удаленном сервере.

На PyPi есть 2 рецепта для этого colle.recipe.distutils 0.1 и zerokspot.recipe.distutils 0.1.1 .

Более поздний модуль является производным от первого и немного более удобен, чем первый, но оба имеют одну и ту же проблему, которую я сейчас опишу.

Когда выполняется bootstrap.py, он загружает пакет zc.buildout и помещает его в директорию яйца buildout. Это дает ./bin/buildout доступ к коду zc.buildout, но / usr / local / python пока ничего не знает о zc.buildout.

Buildout пытается установить пакет, запустив «python setup.py install» внутри подпроцесса. Это создает ImportError, потому что zc.buildout не установлен для /usr/local/python.

Итак, у меня есть несколько решений.

  1. Установите zc.buildout, используя easy_install на удаленном сервере. Мне вообще не нравится эта опция, она делает особый случай для модуля, который очень незначителен.

  2. Измените zerokspot.recipe.distutils таким образом, чтобы блокировка try включала «import zc.buildout» таким образом, она будет установлена, даже если zc.buildout не установлен. Это правильное решение, но несколько хакерское.

  3. Замените подпроцесс кодом, который установит пакет, используя distutils api или setuptools api. Это было бы лучшим решением на мой взгляд.

Вопрос в том, как бы я поступил # 3?

Спасибо, Тарас

PS: я решил проблему, создав другой пакет, который не зависит от zc.buildout. Мой пакет называется taras.recipe.distutils и доступен на pypi.

Ответы [ 3 ]

1 голос
/ 14 сентября 2009

Вы можете вызвать программу командной строки в вашей программе Python, используя модуль подпроцесс :

import subprocess
subprocess.call('python setup.py install')

Однако, насколько вы контролируете среду, в которой будет запускаться эта установка? Если это пакет, который вы распространяете, у вас, скорее всего, будут проблемы, независимо от того, какое решение предлагают люди. Как вы будете обрабатывать случаи, когда вам нужен root-доступ (например, sudo python setup.py install)?

Вы можете рассмотреть Paver , поскольку он предоставляет API, который в некотором смысле является расширением setuptools.

1 голос
/ 14 сентября 2009

zerokspot.recipe.distutils принципиально сломан в том смысле, что он добавляет зависимость от zc.buildout в его файл setup.py следующим образом:

  1. setup.py импорт get_version из zerokspot.recipe.distutils
  2. Все zerokspot.recipe.distutils определены в __init__.py, включая get_version
  3. __init__.py в zerokspot.recipe.distutils, импортируются zc.buildout

Почемуавтор определяет get_version для меня загадка;В соответствии с передовой практикой в ​​самой строке setup.py хранится простая строка версий, и setuptools может работать с версиями dev (до setup.cfg), а также distutils для извлечения метаданных версии.

Как правило, импортировать целое не рекомендуется.пакет в setup.py, так как это потребует наличия всех зависимостей пакета во время установки.Очевидно, что автор пакета установил zc.buildout как пакет для всего сайта и не заметил, что он упустил из виду.

Лучше всего, чтобы вы раскошелили пакет на github, удалили зависимость get_version и предложилисмените оригинального автора, пока вы используете вилку.

0 голосов
/ 14 сентября 2009

Вы уверены, что не хотите просто создать bdist ?

...