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

Ama*_*esh 15 python shell-script

我需要在 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 <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()
Run Code Online (Sandbox Code Playgroud)

Dal*_*jia 31

只需将 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"
Run Code Online (Sandbox Code Playgroud)

  • 我讨厌不加评论就投反对票。这个对我有用。投了赞成票;-) (2认同)
  • 赞成这个答案是因为(与接受的答案不同)它不会将脚本写入文件系统。 (2认同)

mkc*_*mkc 17

如果您想将 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
Run Code Online (Sandbox Code Playgroud)

现在运行pyinbash.sh将产生:

$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe
Run Code Online (Sandbox Code Playgroud)


小智 5

如其他几个答案所示(但未解释),\n以及 Python\xc2\xa03.11.1 文档\n命令行和环境中记录的\n,您可以使用:-c\xc2\xa0command

\n
\n

-c\xc2\xa0command

    \n

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

\n

\n

换句话说,您可以将整个 Python 脚本放入 Bash 字符串中。\xc2\xa0\n这里\xe2\x80\x99s 是一个稍微复杂的\xe2\x80\x8a/\xe2\x80\x8a 复杂的方法,\n使用命令替换和\xc2\xa0here\xc2\xa0文档:

\n
#!/bin/bash\npython3 -c "$(cat << EOF\n\na = input(\'?>\')\nprint(\'you typed\', a)\nprint(\'\\033[1;32mbye...\\033[m\')\n\nEOF\n)"            \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
#!/bin/bash\n\npython3 -c "\na = input(\'?>\') \nprint(\'you typed\', a)\nprint(\'\\033[1;32mbye...\\033[m\')"\n
Run Code Online (Sandbox Code Playgroud)\n

这在 Bash 中存在双引号字符串的常见问题:\nshell 元字符"$`\xc2\xa0\\需要\xc2\xa0 进行转义。\xc2\xa0\n例如,如果\xc2\xa0则需要\xc2 \xa0"在你的Python代码中使用,\n你应该像这样转义它:

\n
#!/bin/bash\n\npython3 -c "\na = input(\'?>\') \nprint(\\"you typed\\", a)\nprint(\\"\\033[1;32mbye...\\033[m\\")"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
#!/bin/bash\n\npython3 -c \'\na = input("?>")\nprint("you typed", a)\nprint("\\033[1;32mbye...\\033[m")\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

相似地,

\n
$ python3 -c "print(\'An odd string:\', \'$((6*7))\')"\nAn odd string: 42\n\n$ python3 -c \'print("An odd string:", "$((6*7))")\'\nAn odd string: $((6*7))\n
Run Code Online (Sandbox Code Playgroud)\n