Пользовательские команды distutils - PullRequest
24 голосов
/ 10 ноября 2009

У меня есть библиотека с именем example, которую я устанавливаю в мою глобальную директорию site-packages. Тем не менее, я хотел бы иметь возможность установить две версии, одну для производства и одну для тестирования (у меня есть веб-приложение и другие вещи, которые имеют такую ​​версию).

Есть ли способ указать, скажем, "python setup.py stage", который не только установит другое яйцо в пакеты сайта, но также переименует модуль из "example" в "example_stage" или что-то подобное?

Если distutils не может сделать это, есть ли другой инструмент, который может?

Ответы [ 4 ]

51 голосов
/ 11 ноября 2009

Это можно легко сделать с помощью distutils, создав подклассы distutils.core.Command внутри setup.py.

Например:

from distutils.core import setup, Command
import os, sys

class CleanCommand(Command):
    description = "custom clean command that forcefully removes dist/build directories"
    user_options = []
    def initialize_options(self):
        self.cwd = None
    def finalize_options(self):
        self.cwd = os.getcwd()
    def run(self):
        assert os.getcwd() == self.cwd, 'Must be in package root: %s' % self.cwd
        os.system('rm -rf ./build ./dist')  

Чтобы включить команду, вы должны указать ее в setup ():

setup(
     # stuff omitted for conciseness.
     cmdclass={
        'clean': CleanCommand
}

Обратите внимание, что вы также можете переопределять встроенные команды, например, что я сделал с «clean». (Мне не понравилось, как встроенная версия оставила позади каталоги dist и build).

% python setup.py --help-commands | grep clean
  clean            custom clean command that forcefully removes dist/build dirs.

Существует ряд соглашений, которые используются:

  • Вы указываете любые аргументы командной строки с помощью user_options .
  • Вы объявляете любые переменные, которые будете использовать с методом initialize_options () , который вызывается после инициализации для настройки вашего собственного пространства имен для подкласса.
  • Метод finalize_options () вызывается непосредственно перед run () .
  • Внутренности самой команды появятся в run () , поэтому обязательно выполните перед этим любую другую подготовительную работу.

Лучший пример для использования - просто посмотреть на исходный код одной из команд по умолчанию, найденных в PYTHON_DIR / distutils / command , таких как install.py или build.py .

13 голосов
/ 11 ноября 2009

Конечно, вы можете расширять distutils новыми командами. В вашем конфигурационном файле distutil добавьте:

 [global]
 command-packages=foo.bar

это может быть distutils.cfg в самом пакете distutils, ..pydistutils.cfg в вашем домашнем каталоге (без начальной точки в Windows) или setup.cfg в текущем каталоге.

Тогда вам нужен пакет foo.bar в каталоге ваших пакетов Python.

Затем в этот пакет вы добавляете классы, реализующие ваши новые желаемые команды, такие как stage, подклассы distutils.cmd - документы слабые, но примеров множество, поскольку все Команды distutils также создаются таким образом.

4 голосов
/ 11 ноября 2009

Если вы хотите использовать несколько версий, тогда virtualenv с virtualenvwrapper может помочь.

3 голосов
/ 11 ноября 2009

См. Ответ Алекса , если вы хотите способ сделать это с помощью distutils, но я считаю Paver лучше для такого рода вещей. Это значительно упрощает создание пользовательских команд или замену существующих. Кроме того, переход не очень сложен, если вы привыкли к distutils или setuptools.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...