Como incluir script python dentro de um script bash

13

Eu preciso incluir abaixo o script python dentro de um script bash.

Se o script bash terminar com êxito, preciso executar o script abaixo:

#!/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
fonte
4
script.sh && python script.py?
Costas
2
Por que "incluí-lo"? Por que não apenas executá-lo?
terdon
1
Para chamar bash-script a partir de pythonimport os os.system ("./script.sh")
Costas

Respostas:

8

Você pode usar o heredoc se desejar manter a fonte dos scripts bash e python juntos. Por exemplo, diga o seguinte é o conteúdo de um arquivo chamado 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

Agora executando o pyinbash.shrenderá:

$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe
mkc
fonte
Pelo comentário do OP para outra resposta, atualizei minha resposta que cuida das variáveis ​​bash no script python.
Mkc
1
Não consigo obter o valor da variável de bash-script para python.
Amal P Ramesh
Substituo subprocess.call (["echo", "\ $ bashvar"]) por subprocess.call (["echo", "bashvar"]) agora está funcionando.
Amal P Ramesh
Isso foi muito legal!
SexyBeast
17

Basta passar um HereDoc para python -.

Da ajuda do 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
fonte
Não vejo por que isso foi rebaixado. É uma solução simples e viável para alguns casos. Porém, ele tem a limitação (principal) de que você não pode usar a entrada padrão no script python (já que está recebendo stdin do heredoc).
Pirocrasty
Eu odeio votos negativos sem comentar. Funciona para mim. Upvoted-lo ;-)
kev
Promovido esta resposta porque (diferentemente da resposta aceita) não grava o script no sistema de arquivos.
Huw Walters 28/03
2

A abordagem mais simples é salvar o script python como, por exemplo, script.pye chamá-lo a partir do script bash ou depois do script bash:

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

Ou

script.sh && script.py
JohannRamos
fonte
No tempo de execução do script bash, algumas variáveis ​​são definidas, preciso disso no script python para o corpo da mensagem.
Amal P Ramesh