Cómo incluir un script python dentro de un script bash

13

Necesito incluir el siguiente script de Python dentro de un script de bash.

Si el script bash termina con éxito, necesito ejecutar el siguiente script:

#!/usr/bin/python    
from smtplib import SMTP
import datetime
debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('192.168.75.1', 25)
smtp.login('my_mail', 'mail_passwd')

from_addr = "My Name <[email protected]>"
to_addr = "<[email protected]"
subj = "Process completed"
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )
#print (date)
message_text = "Hai..\n\nThe process completed."

msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s" % ( from_addr, to_addr, subj, date, message_text )

smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
Amal P Ramesh
fuente
44
script.sh && python script.py?
Costas
2
¿Por qué "incluirlo"? ¿Por qué no solo ejecutarlo?
terdon
1
Para llamar a bash-script desde pythonimport os os.system ("./script.sh")
Costas

Respuestas:

8

Puede usar heredoc si desea mantener juntas la fuente de los scripts bash y python. Por ejemplo, digamos que los siguientes son los contenidos de un archivo llamado pyinbash.sh:

#!/bin/bash

echo "Executing a bash statement"
export bashvar=100

cat << EOF > pyscript.py
#!/usr/bin/python
import subprocess

print 'Hello python'
subprocess.call(["echo","$bashvar"])

EOF

chmod 755 pyscript.py

./pyscript.py

Ahora ejecutando el pyinbash.shproducirá:

$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe
mkc
fuente
Según el comentario de OP a otra respuesta, actualicé mi respuesta que se encarga de las variables bash en el script python.
mkc
1
No puedo obtener el valor de la variable de bash-script en python script.
Amal P Ramesh
Reemplazo subprocess.call (["echo", "\ $ bashvar"]) en subprocess.call (["echo", "bashvar"]) ahora está funcionando.
Amal P Ramesh
Eso fue muy bueno!
SexyBeast
17

Simplemente pase un HereDoc a python -.

De la ayuda de Python python -h:

- : program read from stdin

#!/bin/bash

MYSTRING="Do something in bash"
echo $MYSTRING

python - << EOF
myPyString = "Do something on python"
print myPyString

EOF

echo "Back to bash"
Dalvenjia
fuente
No veo por qué esto fue rechazado. Es una solución simple y viable para algunos casos. Sin embargo, tiene la limitación (principal) de que no puede usar la entrada estándar en el script de python (ya que está recibiendo stdin del heredoc).
Pyrocrasty
Odio los votos negativos sin comentarios. Esto funciona para mi. Votó a favor ;-)
kev
Votó esta respuesta porque (a diferencia de la respuesta aceptada) no escribe el script en el sistema de archivos.
Huw Walters
2

El enfoque más simple es guardar el script de Python como, por ejemplo, script.pyy luego llamarlo desde el script bash o llamarlo después del script bash:

#!/usr/bin/env bash
echo "This is the bash script" &&
/path/to/script.py

O

script.sh && script.py
JohannRamos
fuente
En el tiempo de ejecución del script bash, se definen algunas variables, necesito esto en el script python para el cuerpo del mensaje.
Amal P Ramesh