我需要在 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