Это можно легко сделать с помощью 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 .