Comment inclure un script python dans un script bash

13

J'ai besoin d'inclure le script python ci-dessous dans un script bash.

Si le script bash se termine avec succès, je dois exécuter le script ci-dessous:

#!/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
la source
4
script.sh && python script.py?
Costas
2
Pourquoi "l'inclure"? Pourquoi ne pas simplement l'exécuter?
terdon
1
Pour appeler bash-script depuis pythonimport os os.system ("./script.sh")
Costas

Réponses:

8

Vous pouvez utiliser heredoc si vous souhaitez conserver la source des scripts bash et python ensemble. Par exemple, supposons que le contenu d'un fichier appelé soit le suivant 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

Maintenant, l'exécution du pyinbash.shproduit:

$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe
mkc
la source
Par le commentaire de l'OP à une autre réponse, j'ai mis à jour ma réponse qui prend en charge les variables bash dans le script python.
mkc
1
Je ne peux pas obtenir la valeur de la variable de bash-script en script python.
Amal P Ramesh
Je remplace subprocess.call (["echo", "\ $ bashvar"]) par subprocess.call (["echo", "bashvar"]) maintenant ça marche.
Amal P Ramesh
C'était plutôt bien!
SexyBeast
17

Passez simplement un HereDoc à python -.

Depuis l'aide 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
la source
Je ne vois pas pourquoi cela a été rejeté. C'est une solution simple et réalisable pour certains cas. Il a cependant la limitation (majeure) que vous ne pouvez pas utiliser d'entrée standard dans le script python (car il reçoit stdin de l'hérédoc).
pyrocrastie le
Je déteste les votes sans commentaire. Ça marche pour moi. L'ont voté ;-)
kev
A voté cette réponse parce que (contrairement à la réponse acceptée), elle n'écrit pas le script dans le système de fichiers.
Huw Walters
2

L'approche la plus simple consiste simplement à enregistrer le script python sous, par exemple script.py, puis à l'appeler à partir du script bash ou à l'appeler après le script bash:

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

Ou

script.sh && script.py
JohannRamos
la source
Au moment de l'exécution du script bash, certaines variables sont définies, j'ai besoin de cela sur le script python pour le corps du message.
Amal P Ramesh
0

Que diriez-vous de cela pour un exemple:

PYTHON_BIN=/usr/bin/python
if [ -x $PYTHON_BIN ]; then
$PYTHON_BIN -c "print 'Hello, world'"
else
echo 'Hello, world'
fi

CONTRE

$ ./foobar.py
env: python: No such file or directory
echo9
la source
2
Lorsque vous donnez une réponse, il est préférable de donner une explication quant à la raison pour laquelle votre réponse est la seule.
Stephen Rauch