Subcomando personalizado em setup.py

Às vezes, é útil adicionar um comando personalizado ao nosso setup.pyarquivo – por exemplo, para tornar possível clonar o repositório de um projeto e executar python setup.py bootstrape ter nosso ambiente de desenvolvimento configurado.

Para adicionar um comando personalizado, simplesmente precisamos preparar uma setuptools.Commandsubclasse.
Ele tem um user_optionsatributo que precisamos definir (o setuptools requer) e também alguns métodos abstratos que precisamos implementar (ou pelo menos stub): initialize_optionse finalize_options. Finalmente, podemos implementar o runmétodo.

Aqui está um exemplo simples:

from setuptools import Command
from setuptools import find_packages
from setuptools import setup


class BootstrapEnvironmentCommand(Command):
user_options
= []

def initialize_options(self):
"""Abstract method that is required to be overwritten"""

def finalize_options(self):
"""Abstract method that is required to be overwritten"""

def run(self):
print(" => bootstrapping development environment ...")


setup
(
name
='frogress',
packages
=find_packages(),
include_package_data
=True,
install_requires
=[],
cmdclass
={'bootstrap': BootstrapEnvironmentCommand},
)

Agora é possível executar python setup.py bootstrape, embora não faça nada extravagante (apenas imprime uma linha, conforme implementado no runmétodo), agora temos um bom ponto de partida para torná-lo realmente útil.