2010-02-09 5 views
5

Se ho uno script che costruisce le uova, sostanzialmente eseguendoCome posso rilevare gli errori in modo programmatico durante la creazione di un egg con setuptools?

python setup.py bdist_egg --exclude-source-files 

per un certo numero di file setup.py che utilizzano setuptools per definire come le uova sono costruite, c'è un modo semplice per determinare se ci fossero errori nella costruzione dell'uovo?

Una situazione che avevo di recente, era che c'era un errore di sintassi in un modulo. Setuptools sputava un messaggio sull'errore standard, ma continuava a creare l'uovo omettendo il modulo rotto. Poiché questo faceva parte di un batch che creava un numero di uova, l'errore era mancato e il risultato era inutile.

C'è un modo per rilevare gli errori quando si costruisce un uovo in modo programmatico, oltre a catturare solo l'errore standard e analizzarlo?

risposta

5

distutils utilizzare la funzione py_compile.compile() per compilare i file di origine. Questa funzione accetta un argomento doraise, che quando impostato su True genera un'eccezione sugli errori di compilazione (l'impostazione predefinita è di stampare gli errori su stderr). distutils non chiamare py_compile.compile() con doraise=True, quindi la compilazione non viene interrotta in caso di errori di compilazione.

Per interrompere gli errori ed essere in grado di controllare il codice di ritorno setup.py (sarà diverso da zero sugli errori), è possibile applicare la patch alla funzione py_compile.compile(). Ad esempio, nel tuo setup.py:

from setuptools import setup 
import py_compile 

# Replace py_compile.compile with a function that calls it with doraise=True 
orig_py_compile = py_compile.compile 

def doraise_py_compile(file, cfile=None, dfile=None, doraise=False): 
    orig_py_compile(file, cfile=cfile, dfile=dfile, doraise=True) 

py_compile.compile = doraise_py_compile 

# Usual setup... 
+0

Lavoro eccellente lì! Questo sembra il genere di cose che ti aspetteresti che setuptools/distutils supporti direttamente. – SpoonMeiser