Пользовательские команды 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.