Пользовательские команды distutils

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

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

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

4 ответов


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

 [global]
 command-packages=foo.bar

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

тогда вам нужно foo.пакет bar в каталоге сайтов-пакетов Python.

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


Это можно легко сделать с distutils на подклассы distutils.ядро.Команда внутри 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.


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


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