2013-03-06 8 views
6

Sono nuovo di scons e Python. Mi chiedevo se c'è un modo per invocare scons all'interno di uno script python.Invocare scons da uno script Python

Il mio script python accetta dall'utente, un elenco di directory in cui si trova il codice da compilare insieme (oltre a fare altre cose non banali). Genera anche una stringa che deve essere utilizzata come nome dell'eseguibile creato da scons.

Desidero passare queste informazioni dal mio script python agli scons e quindi richiamare scons. C'è un modo semplice per farlo?

mi vengono in mente le seguenti possibilità:

  • uso subprocess.call("scons"...) io non sono sicuro se scons accetta tutte le informazioni che ho bisogno di passare come argomenti della riga di comando
  • hanno lo script python scrivere in un file . Chiedi a SConscript di analizzare il file e ottenere le informazioni.

risposta

2

Ive ha utilizzato la funzione python subprocess.call() per incapsulare gli argomenti di riga di comando piuttosto lunghi e complessi necessari per il particolare progetto su cui stavo lavorando. Ci sono quelli che hanno sostenuto che l'invocazione avrebbe dovuto essere più semplice in modo da non dover incapsularlo, ma questo è un argomento diverso :)

Un'opzione da considerare invece di utilizzare gli argomenti della riga di comando consiste nell'utilizzare la variabile di ambiente SCONSFLAGS come menzionato here. Personalmente, preferisco non usare questa opzione.

Tutte le opzioni necessarie possono essere passate come opzioni della riga di comando. Un buon modo per personalizzare e gestire SCons da riga di comando è con la funzione SCons AddOption(). Inoltre, è possibile ottenere semplici variabili variable=value utilizzando gli SCons ARGUMENTS dictionary. Altre funzioni della riga di comando SCons correlate sono GetOption() e SetOption().

Per quanto riguarda il passaggio di una stringa per il nome dell'eseguibile: SCons potrebbe non gradire questo. Per lo meno, considera di eseguire lo script una volta con una particolare stringa eseguibile, quindi una seconda volta con uno diverso, quindi si desidera pulire, si può finire per lasciare gli eseguibili in giro se SCons non viene eseguito con lo stesso nome eseguibile.

3

Beh, immagino sia possibile in teoria. L'eseguibile scons è solo uno script python e tutto ciò che fa è eseguire SCons.Script.main() dopo aver modificato la variabile sys.path. Ma probabilmente dovresti iniziare a scavare in profondità nella fonte per capire davvero come farlo fare le cose che vuoi.

Una soluzione molto più pulita chiama lo script dal file SConscript, che è probabilmente l'utilizzo previsto e dovrebbe risultare molto più semplice.

+1

Ho controllato direttamente "SCons.Script.main()" una volta e ho deciso che non ne valeva la pena. Sono andato per il confezionamento della chiamata in un sottoprocesso.call() 'invocazione e gestione degli argomenti della riga di comando come menzionato nella mia risposta. Penso che cercare di bypassare la sceneggiatura di Scons potrebbe portare ad un mondo di dolore :) – Brady

+0

Immagino che questo non risponda alla mia domanda: Se chiamo il mio script Python da SConscript, come faccio a passare le informazioni ad esso che ho appena ottenuto _ prima di invocare scons? –

+0

C'è davvero bisogno di invocare il tuo script prima di scons? È possibile importare lo script come modulo dal file SConscript e quindi eseguirlo secondo necessità, raccogliendo l'input necessario dall'utente. Mentre tecnicamente non è la stessa cosa, non c'è differenza per quanto riguarda l'utente. Se questa non è un'opzione, allora la strada proposta da Brandy è una soluzione fattibile. –

1

Grazie per le risposte. Ho finito per utilizzare questo metodo:

Lo script python scrive un elenco di opzioni in un file di testo, lo chiude e richiama scons -f MySConscript_file utilizzando una chiamata di sottoprocesso. SConstruct legge i valori dal file di testo in un elenco e li utilizza.