Cómo pasar variables de script python a bash script

Tengo un script de bash, a.sh, y en él he llamado un script de python b.py. La secuencia de comandos de Python calcula algo, y quiero que devuelva un valor que se usará más adelante en a.sh. Se que puedo hacer

En a.sh:

var=`python b.py` 

En b.py:

 print x # when x is the value I want to pass 

Pero esto no es tan conveniente, porque también imprimo otros mensajes en b.py

¿Hay alguna forma mejor de hacerlo?

Editar:

Lo que estoy haciendo ahora es solo

 var=`python b.py | tail -n 1` 

Significa que puedo imprimir muchas cosas dentro de b.py, pero solo la última línea (el último comando de impresión, asumiendo que no contiene “\ n”) se almacenará en la var.

¡Gracias por todas las respuestas!

Lo imprimiría en un archivo elegido en la línea de comandos y luego obtendría ese valor en bash con algo como cat .

Así que irías:

 python b.py tempfile.txt var=`cat tempfile.txt` rm tempfile.txt 

[EDITAR, otra idea basada en otras respuestas]

Su otra opción es formatear su salida con cuidado para que pueda usar las funciones de bash como head / tail para canalizar solo las primeras / últimas líneas en su próximo progtwig.

Creo que la respuesta es

.py

 import sys a=['zero','one','two','three'] b = int(sys.argv[1]) ###your python script can still print to stderr if it likes to print >> sys.stderr, "I am no converting" result = a[b] print result 

.sh

 #!/bin/sh num=2 text=`python numtotext.py $num` echo "$num as text is $text" 

No estoy seguro de “mejor”, pero podría escribir el resultado en un archivo y luego leerlo nuevamente en Bash y luego borrarlo.

Esto definitivamente es feo, pero es algo que se debe tener en cuenta en caso de que otra cosa haga el truco.

En su script de Python, redirija otros mensajes a stderr e imprima x a stdout:

 import sys ... print >>sys.stderr, "another message" print x 

en el guión de bash:

 ... var=`python b.py 2>/dev/null` 

Además, si x es un número entero entre 0,255, puede usar el código de salida para pasarlo al bash:

 import sys ... sys.exit(x) 

en bash

 python b.py var=$? 

Tenga en cuenta que el código de salida se utiliza para indicar errores, 0 significa que no hay error y esto rompe la convención.

En bash backsticks works

Por lo general hago algo como

 PIP_PATH=`python -c "from distutils.sysconfig \ import get_python_lib; print(get_python_lib())"` POWELINE_PATH=$PIP_PATH"/powerline" echo $POWELINE_PATH 

Puede escribir la salida en un archivo temporal y hacer que el shell lea y elimine ese archivo. Esto es incluso menos conveniente, pero se reserva la salida estándar para la comunicación con el usuario.

Alternativamente, puede usar algún tipo de formato para la salida estándar: las primeras n líneas son ciertas variables, el rest será enviado por el shell primario al usuario. Tampoco es conveniente, pero evita el uso de archivos temporales.