2009-04-08 11 views
16

Sto provando a usare scons per costruire un documento in lattice. In particolare, voglio ottenere scons per invocare un programma python che genera un file contenente una tabella che è \ input {} nel documento principale. Ho esaminato la documentazione di scons, ma non mi è immediatamente chiaro cosa devo fare.Come ottenere scons per richiamare uno script esterno?

Ciò che desidero raggiungere è essenzialmente quello che si otterrebbe con questo makefile:

document.pdf: table.tex 
    pdflatex document.tex 

table.tex: 
    python table_generator.py 

Come posso esprimere questo concetto in scons?

risposta

16

Qualcosa in questo senso dovrebbe fare -

env.Command ('document.tex', '', 'python table_generator.py') 
env.PDF ('document.pdf', 'document.tex') 

Esso dichiara che 'document.tex' viene generato chiamando lo script Python, e richiede un documento PDF da creare da questo generatd 'document.tex' file.

Si noti che questo è solo in spirito. Potrebbe richiedere qualche ritocco. In particolare, non sono sicuro di quale tipo di semantica vorresti per la generazione di "document.tex" - dovrebbe essere generata ogni volta? Solo quando non esiste? Quando qualche altro file cambia? (si vorrebbe aggiungere questa dipendenza come secondo argomento a Command() quel caso).

Inoltre, l'output di Command() può essere utilizzato come input per PDF() se lo si desidera. Per chiarezza, non l'ho fatto.

4

In questo semplice caso, il modo più semplice è usare solo il modulo sottoprocesso

from subprocess import call 
call("python table_generator.py") 
call("pdflatex document.tex") 

Indipendentemente da dove nel file SConstruct sono posti queste righe, che avverrà prima di qualsiasi della compilazione e collegamento effettuato da SCons.

Lo svantaggio è che questi comandi verranno eseguiti ogni volta che si esegue SCons, anziché solo quando i file sono stati modificati, il che è ciò che accadrebbe nel tuo esempio Makefile. Quindi se questi comandi impiegano molto tempo per essere eseguiti, questa non sarebbe una buona soluzione.

Se è davvero necessario eseguire questi comandi solo quando i file sono stati modificati, consultare la sezione del manuale di SCons Writing Your Own Builders.

+3

Come si integra questo con lo scanner in lattice? Posso avere ancora PDF (target = 'document.pdf', source = 'document.tex') in SConstruct? – saffsd

Problemi correlati