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.