前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell脚本里调用Python程序

Shell脚本里调用Python程序

作者头像
py3study
发布2020-01-09 23:13:40
1.5K0
发布2020-01-09 23:13:40
举报
文章被收录于专栏:python3python3

脚本背景:主管要求看门狗程序不仅仅只是看门,还要在看门成功的时候发送邮件给各个开发人员,而且必须要用公司原有的python程序作为发送邮件的主程序,所以需要在原有的看门狗程序上加一句话,而这个看门狗程序恰恰是shell程序,两种不同程序混搭交织,还有变量的混搭交织,很是让人爱恨交织。

那个发送邮件的程序,程序名叫AutoMail.py,内容如下

代码语言:javascript
复制
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

mailto_list=["开发人员A@我的公司名.com","开发人员B@我的公司名.com","开发人员C@我的公司名.com"]
mail_host="mail.我的公司名.com"
mail_user="登陆发送邮箱的用户名"
mail_pass="这里是发送邮箱的密码"
mail_postfix="公司名.com"
mail_sender="用户名@我的公司.com"
def send_mail(sub, content):
    me=mail_sender    #为什么这里要设定一个me?写这个脚本的大哥图啥?
    msg = MIMEMultipart()
    msg['Subject'] = sub
    msg['From'] = me    #可以看得出,抄脚本这个大哥是从下往上抄的,me一看就是后补的,直接放mail_sender犯法?
    msg['To'] = ";".join(mailto_list)
    content1 = MIMEText(str(content), 'plain', 'utf-8')
    msg.attach(content1)
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me, mailto_list, msg.as_string())
        print('send sucess\n')
        s.close()
    except Exception as e: print(str(e))

看门狗程序全文就不写了,这个涉及到了公司机密。

现在的重点就是要在看门狗这个shell脚本里添加一句命令,这个命令要启动AutoMail.py这个脚本,同时还要传导出看门狗负责的模块名,这里又涉及到了在python的启动命令里添加shell变量的“难点”(其实一点也不难)。

解决思路:Python的sys有一个属性叫sys.argv,这个属性可以拿到命令列里的参数。

举个例子吧,假设有一个脚本叫111.py,里面的内容如下:

wKiom1ey0vnTm6f-AAASK2EWWgU526.png-wh_50
wKiom1ey0vnTm6f-AAASK2EWWgU526.png-wh_50

当我启动这个脚本并在启动的同时传入参数的时候,输出是这样的:

wKiom1ey02SB1TWLAAAgqBgsSt4216.png
wKiom1ey02SB1TWLAAAgqBgsSt4216.png

借用这个特性,就可以实现上面的要求了,我们可以把邮件的标题和正文当作两个参数随着启动AutoMail.py的语句一起执行,于是我把整个AutoMail.py的内容更改如下:

代码语言:javascript
复制
import sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

mailto_list=["开发人员A@我的公司名.com","开发人员B@我的公司名.com","开发人员C@我的公司名.com"]
mail_host="mail.我的公司名.com"
mail_user="登陆发送邮箱的用户名"
mail_pass="这里是发送邮箱的密码"
mail_postfix="公司名.com"
mail_sender="用户名@我的公司.com"
def send_mail(sub, content):
    me=mail_sender
    msg = MIMEMultipart()
    msg['Subject'] = sub
    msg['From'] = me
    msg['To'] = ";".join(mailto_list)
    content1 = MIMEText(str(content), 'plain', 'utf-8')
    msg.attach(content1)
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me, mailto_list, msg.as_string())
        print('send sucess\n')
        s.close()
    except Exception as e: print(str(e))
    
if __name__=='__main__':
        send_mail(*sys.argv[1:])

增加了一头一尾,同时在看门狗程序里添加“python /AutoMail文件的绝对路径/AutoMail.py $name已经重启 "进程重启!"”这样一句话,其中name是一个变量,就是被“看门”的模块名,保存退出之后,kill掉一个模块,让看门狗重启模块实验一下,结果很满意,如图:

wKioL1ey1QvCsigMAAA8rO3JnhA448.png-wh_50
wKioL1ey1QvCsigMAAA8rO3JnhA448.png-wh_50

这里应该有人好奇了,明明是启动python程序,却在命令里添加了一个shell的变量,为什么python还是可以识别呢?因为虽然命令是启动python程序,但是命令本身是shell的语句啊,所以shell的语句当然可以识别shell的变量了~~~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档