Как включить скрипт Python внутри скрипта Bash

13

Мне нужно включить ниже сценарий Python внутри сценария Bash.

Если сценарий bash завершится успешно, мне нужно выполнить следующий сценарий:

#!/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?
Костас
2
Зачем «включать» это? Почему бы просто не запустить его?
Terdon
1
Вызвать bash-скрипт из pythonimport os os.system ("./script.sh")
Costas

Ответы:

8

Вы можете использовать heredoc, если хотите сохранить исходные тексты обоих скриптов bash и python. Например, допустим, что содержимое файла называется так 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

Теперь запуск pyinbash.shбудет давать:

$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe
MKC
источник
В соответствии с комментарием OP к другому ответу, я обновил свой ответ, который заботится о переменных bash в скрипте python.
MKC
1
Я не могу получить значение переменной из bash-script в python-скрипт.
Амаль П Рамеш
Я заменяю subprocess.call (["echo", "\ $ bashvar"]) на subprocess.call (["echo", "bashvar"]), теперь он работает.
Амаль П Рамеш
Это было довольно опрятно!
SexyBeast
17

Просто передайте HereDoc python -.

Из справки 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
источник
Я не понимаю, почему это было понижено. Это простое и выполнимое решение для некоторых случаев. У него есть (главное) ограничение, что вы не можете использовать стандартный ввод в скрипте Python (поскольку он получает стандартный ввод от heredoc).
пирокрастия
Я ненавижу понижения без комментариев. Меня устраивает. Upvoted это ;-)
к
Проголосовал этот ответ, потому что (в отличие от принятого ответа) он не записывает скрипт в файловую систему.
Хью Уолтерс
2

Самый простой подход - просто сохранить скрипт Python как, например, script.pyа затем либо вызвать его из скрипта bash, либо вызвать его после скрипта bash:

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

Или

script.sh && script.py
JohannRamos
источник
Во время выполнения bash-скрипта определяются некоторые переменные, это нужно в скрипте python для тела сообщения.
Амаль Р Рамеш,
0

Как насчет этого для примера:

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

В.С.

$ ./foobar.py
env: python: No such file or directory
echo9
источник
2
Когда вы даете ответ, предпочтительно дать какое-то объяснение, ПОЧЕМУ ваш ответ тот.
Стивен Раух