Personalizzato Distutils comandi
-
19-09-2019 - |
Domanda
Ho una libreria chiamata "esempio" che sto installando nella mia directory globale site-packages. Tuttavia, mi piacerebbe essere in grado di installare due versioni, una per la produzione e uno per la prova (Ho un'applicazione web e altre cose che sono di versione in questo modo).
C'è un modo per specificare, dire "fase python setup.py" che non solo installare un uovo diverso in site-packages, ma anche rinominare il modulo da "esempio" a "example_stage" o qualcosa di simile?
Se distutils non può farlo, c'è qualche altro strumento che può?
Soluzione
Certo, è possibile estendere distutils con nuovi comandi. Nel file di configurazione distutil, aggiungere:
[global]
command-packages=foo.bar
questo può essere in distutils.cfg
nel pacchetto distutils
sé, ..pydistutils.cfg
nella vostra home directory (nessun punto iniziale su Windows), o setup.cfg
nella directory corrente.
Allora avete bisogno di un pacchetto foo.bar nella directory site-packages di Python.
Poi in quel pacchetto si aggiungono le classi di attuazione vostri nuovi comandi desiderati, come ad esempio stage
, sottoclasse distutils.cmd -. la documentazione sono deboli, ma ci sono un sacco di esempi in quanto tutti i comandi Distutils esistenti sono anche costruiti in questo modo
Altri suggerimenti
Questo può facilmente essere fatto con distutils sottoclasse distutils.core.Command all'interno di setup.py.
Ad esempio:
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')
Per abilitare il comando è necessario fare riferimento in setup ():
setup(
# stuff omitted for conciseness.
cmdclass={
'clean': CleanCommand
}
Si noti che è possibile ignorare comandi incorporati in questo modo anche, come quello che ho fatto con 'pulita'. (Non mi piace come la versione built-in a sinistra dietro la 'dist' e le directory 'build'.)
% python setup.py --help-commands | grep clean
clean custom clean command that forcefully removes dist/build dirs.
Ci sono una serie di convenzioni che vengono utilizzati:
- specificare tutti gli argomenti della riga di comando con user_options .
- Si dichiara alcuna variabile si usa con le initialize_options () di metodo, che è chiamata dopo l'inizializzazione per configurare il vostro spazio dei nomi personalizzato per la sottoclasse.
- finalize_options () metodo viene chiamato a destra prima di run () .
- Il coraggio del comando stesso avverrà in run () in modo da essere sicuri di fare qualsiasi altro lavoro di preparazione prima di questa.
L'esempio migliore da usare è solo di guardare il codice sorgente per uno dei comandi di default si trovano a PYTHON_DIR / distutils / comando come install.py o < em> build.py .
Se si desidera utilizzare la versione più quindi virtualenv con virtualenvwrapper può aiutare
.Si veda la risposta di Alex se volete un modo per fare questo con distutils, ma trovo Paver essere migliore per questo genere di cose. Lo rende molto più facile fare i comandi personalizzati o sovrascrivere quelli esistenti. Inoltre la transizione non è terribilmente difficile se siete abituati a Distutils o setuptools.