2010-01-22 9 views
12

Ho una funzione Python, fooPy() che restituisce un valore. (Int/doppia o stringa)valore assegnando a guscio variabile con un valore restituito da funzione Python

voglio usare questo valore e assegnarlo in uno script di shell. Ad esempio seguente è la funzione python:

def fooPy(): 
    return "some string" 
    #return 10 .. alternatively, it can be an int 

fooPy() 

Nello script di shell ho provato le seguenti cose, ma nessuna di esse funziona.

fooShell = python fooPy.py 
#fooShell = $(python fooPy.py) 
#fooShell = echo "$(python fooPy.py)" 

risposta

32

È possibile stampare il valore in Python, come questo:

print fooPy() 

e nello script di shell:

fooShell=$(python fooPy.py) 

Assicurarsi di non lasciare spazi intorno al = nel guscio script.

+1

grazie, ha funzionato! Ho anche commesso un errore inserendo degli spazi intorno =. Così risolto anche quello. – cppb

+0

+1 per aver menzionato "Assicurati di non lasciare spazi attorno allo = nella sceneggiatura della shell". Dà fastidio ai principianti come me. –

10

Nel codice Python, è necessario stampare il risultato.

import sys 
def fooPy(): 
    return 10 # or whatever 

if __name__ == '__main__': 
    sys.stdout.write("%s\n", fooPy()) 

Poi nella shell, si può fare:

fooShell=$(python fooPy.py) # note no space around the '=' 

Nota che ho aggiunto un controllo if __name__ == '__main__' nel codice Python, per assicurarsi che la stampa viene eseguita solo quando il programma viene eseguito da la riga di comando, non quando lo si importa dall'interprete Python.

Ho anche usato sys.stdout.write() anziché print, perché

  • print ha un comportamento diverso in Python 2 e Python 3,
  • in "veri programmi", si dovrebbe usare sys.stdout.write() anziché print comunque :-)
+0

+ 1 per una risposta dettagliata e note su sys.stdout.write() E 'utile. Grazie! – cppb

+0

Brillante. Esattamente quello che stavo cercando –

3

È necessario print il valore restituito da fooPy. La sostituzione della shell legge dallo stdout. Sostituire l'ultima riga del programma con print fooPy() e quindi utilizzare il secondo gasdotto shell che hai citato. Dovrebbe funzionare.

5

Se si desidera il valore dall'istruzione Python sys.exit, sarà nella variabile speciale della shell $?.

$ var=$(foo.py) 
$ returnval=$? 
$ echo $var 
Some string 
$ echo returnval 
10 
+0

+1 per indicare il modo di ottenere il codice di terminazione ... ma lasciatemi fissare un piccolo dettaglio. – fortran

+0

Grazie per la correzione (tali sono i rischi di lavorare in più lingue). –

+0

hmm..questa chiamata "print return_val" non è necessaria (non ancora provata). Grazie, questa è un'informazione utile. +1. – cppb

Problemi correlati