如何在 bash 脚本中包含 python 脚本

如何在 bash 脚本中包含 python 脚本

我需要在 bash 脚本中包含以下 python 脚本。

如果 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 <[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()

答案1

只需将 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"

答案2

如果您想将 bash 和 python 脚本的源代码保留在一起,可以使用heredoc。例如,假设以下是名为 的文件的内容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
Executing a bash statement
Hello python
100

答案3

如其他几个答案所示(但未解释)以及 Python 3.11.1 文档中所述 命令行和环境, 您可以使用:-c command

-c command

    执行Python代码command。  command可以是由换行符分隔的一个或多个语句,与正常模块代码中一样具有重要的前导空格。

换句话说,您可以将整个 Python 脚本放入 Bash 字符串中。这是一个稍微复杂/令人费解的方法,使用命令替换和此处文档:

#!/bin/bash
python3 -c "$(cat << EOF

a = input('?>')
print('you typed', a)
print('\033[1;32mbye...\033[m')

EOF
)"            

这有效。 (命令 $()替换)将内部命令的输出(在本例中为cat)作为参数传递给 Python。由于没有管道,因此可以在 Python 代码中使用标准输入。

这种更简单的方法(使 Python 脚本成为 文字字符串)也有效:

#!/bin/bash

python3 -c "
a = input('?>') 
print('you typed', a)
print('\033[1;32mbye...\033[m')"

这在 Bash 中存在双引号字符串的常见问题:shell 元字符", $,`和 \需要转义。例如,如果您需要"在 Python 代码中使用,您应该像这样转义:

#!/bin/bash

python3 -c "
a = input('?>') 
print(\"you typed\", a)
print(\"\033[1;32mbye...\033[m\")"

但是为什么不直接将 Python 代码中的所有单引号更改为双引号,并将整个 Python 脚本放入单引号中呢?

#!/bin/bash

python3 -c '
a = input("?>")
print("you typed", a)
print("\033[1;32mbye...\033[m")'

相似地,

$ python3 -c "print('An odd string:', '$((6*7))')"
An odd string: 42

$ python3 -c 'print("An odd string:", "$((6*7))")'
An odd string: $((6*7))

答案4

最简单的方法是将 python 脚本另存为,例如script.py,然后从 bash 脚本调用它,或者调用它bash 脚本:

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

或者

script.sh && script.py

相关内容