Esto se puede hacer fácilmente con distutils mediante la subclasificación de distutils.core.Command dentro de setup.py.
Por ejemplo:
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')
Para habilitar el comando que hay que hacer referencia a ella en la configuración():
setup(
# stuff omitted for conciseness.
cmdclass={
'clean': CleanCommand
}
Tenga en cuenta que puede anular comandos integrados de esta manera también, como lo Lo hice con 'limpio'. (No me gusta la forma en la versión incorporada dejado atrás el 'dist' y directorios 'construir'.)
% python setup.py --help-commands | grep clean
clean custom clean command that forcefully removes dist/build dirs.
Hay una serie de convenciones que se utilizan:
- Se especifica cualquier argumento de la línea de comandos con user_options.
- Declara cualquier variable que usaría con el método initialize_options(), que se invoca después de la inicialización para configurar su espacio de nombres personalizado para la subclase.
- El método finalize_options() se llama justo antes de ejecutar().
- Las agallas del comando se producirán en run(), así que asegúrese de hacer cualquier otro trabajo de preparación antes de eso.
El mejor ejemplo de uso es sólo para mirar el código fuente de una de las órdenes por defecto encontrado en PYTHON_DIR/distutils/comando como install.py o build.py.
Responde a la pregunta, pero virtualenv es una mejor respuesta al problema. –