Come includere script Python all'interno di uno script bash


13

Ho bisogno di includere sotto lo script Python all'interno di uno script Bash.

Se lo script bash termina con successo, devo eseguire lo script seguente:

#!/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
Perché "includerlo"? Perché non eseguirlo?
terdon

1
Per chiamare bash-script da Pythonimport os os.system ("./script.sh")
Costas,

Risposte:


8

Puoi usare heredoc se vuoi mantenere insieme la fonte di entrambi gli script bash e python. Ad esempio, supponiamo che quanto segue sia il contenuto di un file chiamato 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

Ora eseguendo la pyinbash.shresa si ottiene:

$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe

Per il commento di OP ad un'altra risposta, ho aggiornato la mia risposta che si occupa delle variabili bash nello script python.
mkc,

1
Non riesco a ottenere il valore della variabile da bash-script a python script.
Amal P Ramesh,

Sostituisco subprocess.call (["echo", "\ $ bashvar"]) in subprocess.call (["echo", "bashvar"]) ora funziona.
Amal P Ramesh,

È stato abbastanza pulito!
SexyBeast

17

Basta passare un HereDoc a python -.

Dall'aiuto di 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"

Non vedo perché questo è stato sottoposto a downgrade. È una soluzione semplice e praticabile per alcuni casi. Ha la (maggiore) limitazione che non è possibile utilizzare l'input standard nello script Python (dal momento che riceve lo stdin dall'ereditarietà).
pirocrastica,

Odio i voti negativi senza commenti. Per me funziona. L'ho votato ;-)
kev il

Questa risposta è stata annullata perché (diversamente dalla risposta accettata) non scrive lo script nel file system.
Huw Walters,

2

L'approccio più semplice è quello di salvare lo script Python come, ad esempio, script.pye quindi chiamarlo dallo script bash o chiamarlo dopo lo script bash:

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

O

script.sh && script.py

Nel tempo di esecuzione di bash-script vengono definite alcune variabili, ne ho bisogno sullo script python per il corpo del messaggio.
Amal P Ramesh,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.