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 <my_mail@192.168.75.1>"
to_addr = "<my_mail@192.168.75.1"
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()

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

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"

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.