2010-01-22 10 views
12

Tengo una función de Python, fooPy() que devuelve algún valor. (int/double o string)asignando valor a la variable de shell utilizando un valor de retorno de función de Python

Quiero utilizar este valor y asignarlo en un script de shell. Por ejemplo siguiente es la función de Python:

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

fooPy() 

En el script de shell probé las siguientes cosas pero ninguno de ellos funcionó.

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

Respuesta

32

Puede imprimir su valor en Python, así:

print fooPy() 

y en su secuencia de comandos shell:

fooShell=$(python fooPy.py) 

Asegúrese de no dejar espacios en todo el = en la cáscara guión.

+1

gracias, eso funcionó! También cometí un error al poner espacios alrededor de =. Así que solucionó eso también. – cppb

+0

+1 por mencionar "Asegúrate de no dejar espacios alrededor del = en el guión del intérprete de comandos" A los novatos les molesta muchísimo como yo. –

10

En su código de Python, necesita imprimir el resultado.

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

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

A continuación, en la cáscara, que puede hacer:

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

Tenga en cuenta que he añadido una comprobación if __name__ == '__main__' en el código Python, para asegurarse de que la impresión se realiza sólo cuando el programa se ejecuta desde la línea de comando, no cuando la importas desde el intérprete de Python.

También utilicé sys.stdout.write() en lugar de print, porque

  • print tiene un comportamiento diferente en Python 2 y Python 3,
  • en "programas reales", se debe utilizar en lugar de sys.stdout.write()print todos modos :-)
+0

+ 1 para obtener una respuesta detallada y notas sobre sys.stdout.write() Es útil. ¡Gracias! – cppb

+0

Brillante. Exactamente lo que estaba buscando –

3

Debe print el valor devuelto por fooPy. La sustitución de shell lee de stdout. Reemplace la última línea de su programa con print fooPy() y luego use la segunda tubería de shell que ha mencionado. Deberia de funcionar.

5

Si desea el valor de la declaración de Python sys.exit, estará en la variable especial de shell $?.

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

+1 para señalar el camino para obtener el código de terminación ... pero déjame arreglar un pequeño detalle. – fortran

+0

Gracias por la corrección (tales son los peligros de trabajar en múltiples idiomas). –

+0

hmm ... esto hace que la llamada "print return_val" sea innecesaria (aún no se ha intentado). Gracias, esta es información útil. +1. – cppb

Cuestiones relacionadas