Пользовательские команды distutils
-
19-09-2019 - |
Вопрос
У меня есть библиотека под названием "example", которую я устанавливаю в свой глобальный каталог пакетов сайта.Тем не менее, я хотел бы иметь возможность установить две версии, одну для производства и одну для тестирования (у меня есть веб-приложение и другие вещи, которые имеют версию таким образом).
Есть ли способ указать, скажем, "python setup.py stage", который не только установит другое egg в пакеты сайта, но и переименует модуль из "example" в "example_stage" или что-то подобное?
Если distutils не может этого сделать, есть ли какой-нибудь другой инструмент, который может?
Решение
Конечно, вы можете расширить distutils новыми командами.В файле конфигурации distutil добавьте:
[global]
command-packages=foo.bar
это может быть в distutils.cfg
в distutils
сам пакет, ..pydistutils.cfg
в вашем домашнем каталоге (без начальной точки в Windows) или setup.cfg
в текущем каталоге.
Затем вам понадобится пакет foo.bar в каталоге site-packages вашего Python.
Затем в этот пакет вы добавляете классы, реализующие ваши новые желаемые команды, такие как stage
, подкласс distutils.cmd -- документация слабая, но примеров достаточно, поскольку все существующие команды distutils также построены таким образом.
Другие советы
Это можно легко сделать с distutils, создав подкласс distutils.core.Команда внутри 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.
Существует ряд соглашений, которые используются:
- Вы указываете любые аргументы командной строки с помощью параметры пользователя.
- Вы объявляете любые переменные, которые вы бы использовали с initialize_options() инициализировать параметры () метод, который вызывается после инициализации, чтобы настроить ваше пользовательское пространство имен для подкласса.
- Тот Самый finalize_options() метод вызывается непосредственно перед выполнить().
- Суть самой команды будет заключаться в выполнить() так что не забудьте перед этим проделать любую другую подготовительную работу.
Лучший пример для использования - просто взглянуть на исходный код одной из команд по умолчанию, найденных по адресу PYTHON_DIR/distutils/команда такие , как install.py или build.py.
Если вы хотите использовать несколько версий, тогда виртуальное окружение с виртуальная оболочка может помочь.
Видеть Ответ Алекса если вам нужен способ сделать это с помощью distutils, но я нахожу асфальтоукладчик быть лучше для такого рода вещей.Это значительно упрощает создание собственных команд или переопределение существующих.Плюс переход не очень сложен, если вы привыкли к distutils или setuptools.