2012-03-05 21 views
6

Juro que he visto esto antes pero no puedo encontrarlo ahora. ¿Es posible tener un script de shell se inicia una pitón interpeter "medio curso", es decir:¿Es posible el guión mixto de shell y python?

#!/bin/bash 
#shell stuff.. 

set +e 

VAR=aabb 

for i in a b c; do 
    echo $i 
done 

# same file! 

#!/usr/bin/env python 
# python would be given this fd which has been seek'd to this point 

import sys 

print ("xyzzy") 

sys.exit(0) 

Respuesta

8

Puede utilizar esta sintaxis de comandos (que se llama aquí documentan en la literatura Unix):

#!/bin/sh 
echo this is a shell script 

python <<@@ 
print 'hello from Python!' 
@@ 

El marcador después del operador '< <' puede por un identificador arbitrario, las personas a menudo usan algo como EOF (fin de archivo) o EOD (fin del documento). Si el marcador comienza una línea, el intérprete lo interpreta como el final de la entrada para el programa.

2

Se puede escribir

exec python <<END_OF_PYTHON 
#!/usr/bin/env python 

import sys 

print ("xyzzy") 

sys.exit(0) 
END_OF_PYTHON 

para reemplazar el proceso Bash con Python y aprobar el programa especificado a Python en su entrada estándar. (El exec reemplaza el proceso Bash La entrada estándar <<END_OF_PYTHON causas que contiene todo lo que hasta el END_OF_PYTHON..)

+0

+1: como la ejecución es superior a la invocación de python. El shebang es innecesario en este contexto, y se tratará simplemente como un comentario. –

+0

@WilliamPursell: Ya sabes, ni siquiera noté el shebang. . . no solo es innecesario, sino que es engañoso, ya que no invocará 'env'. Supongo que el comando podría ser 'exec env python << END_OF_PYTHON', pero probablemente sea mejor simplemente eliminar el shebang. – ruakh

0

Por supuesto, justo después de que envió este recordé una manera de hacerlo:

#!/bin/sh 

echo Shell 

python <<EOF 

import sys 

print "Python" 

sys.exit(0) 

EOF 
2

Si su python el script es muy corto. Puede pasar como una cadena de python usando la opción -c:

python -c 'import sys; print "xyzzy"; sys.exit(0)' 

O

python -c ' 
import sys 
print("xyzzy") 
sys.exit(0) 
' 
0

Estoy de acuerdo que la mezcla/maceración hasta puede ser una poderosa técnica - no sólo en secuencias de comandos, sino también en línea de comando (p. ej., las impresoras perl han demostrado ser muy exitosas con el tiempo). Así que mi consejo pequeña en otra variación de una sola línea (además de la mencionada por keV) para secuencias de comandos mixtas en bash/Python:

for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done; 

produce

x 
y 
z 
0

que es ideal para la escritura en línea corta/código. Si uno puede confiar en el script bash como pegamento adecuado para escribir una aplicación grande y buena, se podría tener diferentes miembros del equipo escribiendo código/script en cualquier idioma en el que sean buenos y luego uno simplemente podría vincular su trabajo de la siguiente manera. Por supuesto, uno también debería asumir que tantos tiempos de ejecución diferentes están bien para una aplicación. @ user318904 @phs @piokuc

#!/bin/bash 
java hello 
#hello class bytecode to be in the path 
python hello.py 
elixir simple.exs 
perl hello.pl 
nodejs sum1.js 
coffee sum2.coffee 
#any other bash script can be put anywhere 
Cuestiones relacionadas