2011-12-19 20 views
11

Sto cercando di capire come chiamare una funzione Python da uno script di shell.Chiamare una funzione Python da uno script di shell

Ho un file Python con più funzioni e ho bisogno di utilizzare i valori restituiti da loro nel mio script di shell. C'è un modo per farlo.

Sto facendo questo per leggere un file di configurazione usando Python e ottenere i valori nella shell. C'è qualche altro modo migliore per raggiungere questo obiettivo.

test.py contiene:

import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read("test.conf") 

def get_foo(): 
    return config.get("locations", "foo") 

def get_bar(): 
    return config.get("locations", "bar") 

ho bisogno di memorizzare i valori restituiti dalle funzioni Python in una variabile shell.

+3

Qual è il problema più grande che stai cercando di risolvere? Perché non usare lo script con la configurazione fai il lavoro dello script di shell? In alternativa, perché non leggere la configurazione dalla shell? Presumo che il problema sia abbastanza complesso da suddividere questo in due file. –

risposta

22

È possibile inviare il risultato delle vostre funzioni sullo standard output, chiedendo l'interprete Python per stampare il risultato:

python -c 'import test; print test.get_foo()' 

L'opzione -c chiede semplicemente Python per eseguire alcuni comandi Python.

Al fine di memorizzare il risultato in una variabile, si può dunque fare:

RESULT_FOO=`python -c 'import test; print test.get_foo()'` 

o, equivalentemente

RESULT=$(python -c 'import test; print test.get_foo()') 

dal backticks e $(…) valutare un comando e sostituirlo con la sua uscita.

PS: Ottenere il risultato di ogni funzione richiede l'analisi del file di configurazione ogni volta, con questo approccio. Questo può essere ottimizzata facendo ritornare tutti i risultati in una sola volta, con qualcosa come:

ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()') 

I risultati possono poi essere divisi e messi in diverse variabili con

RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2) 

che prende il secondo risultato e lo mette in RESULT_BAR per esempio (e allo stesso modo: -fn per il risultato #n).

PPS: Come detto Pablo Maurin, probabilmente sarebbe più facile da fare tutto in un unico interprete (Python, ma forse anche il guscio), se possibile, invece di calcolare variabili in un programma e il loro utilizzo in un altro uno.

+0

o prova a inviare l'output ad altro script python ed eseguirlo. – sum2000

+0

sembra bello .. ha funzionato .. mi stavo chiedendo. in questo caso .. per leggere il parametro n dal file di configurazione ho bisogno di chiamare n volte la riga precedente dalla shell che finirà per leggere tante volte in python usando configparser. c'è qualche altro modo migliore che potrei fare? –

+1

@saddy: è possibile ad esempio stampare entrambi i risultati insieme e quindi utilizzare le utilità Unix per dividerli: 'RESULT = $ (import test; print test.get_foo(), test.get_bar())', e quindi usare 'cut ',' sed' (?), o 'awk' (?) per estrarre ogni parte del risultato a sua volta: 'RESULT2 = $ (echo $ RESULT | cut -d '' -f 2)' dà il tuo 'get_bar()', ecc. – EOL

Problemi correlati