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 <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()

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

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"

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.