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

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

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplicationmailto_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'] = submsg['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,里面的内容如下:

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

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

import sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplicationmailto_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_sendermsg = MIMEMultipart()msg['Subject'] = submsg['From'] = memsg['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掉一个模块,让看门狗重启模块实验一下,结果很满意,如图:

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

转载于:https://blog.51cto.com/chenx1242/1839279

Shell脚本里调用Python程序相关推荐

  1. shell脚本配置运行python程序,小技巧之 Linux 软连接的使用

    shell脚本配置运行python程序,小技巧之 Linux 软连接的使用 实验室的多位博士会在同一台机器上跑python程序,主流的跑程序的方法有两种 使用sh脚本配置路径和程序 直接激活conda ...

  2. linux打开pythonshall,linux系统shell脚本后台运行python程序

    python开发的同学们应该都知道怎么样去启动一个python应用,但是一旦我们把python应用部署到linux服务器上该如何启动呢? 方式①:就是使用进程管理工具,比如supervisor.想了解 ...

  3. m 文件 dll matlab 中调用_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  4. php调用python绘图程序_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  5. GDB怎么调试使用.sh(shell脚本)启动的程序?(未完成,待测试)

    1 )直接在shell脚本中调用GDB.这意味着你没有标准的和标准的重定向.(不知道怎么操作..反正没成功) 2)运行shell脚本,然后将调试器附加到已经运行的c ++进程,像这样:gdb prog ...

  6. java里调用Python

    显然,在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果.需要注意的是,不能 ...

  7. python eel 多线程_利用Eel使JavaScript调用Python程序

    利用Eel使JavaScript调用Python程序 Eel简介 Eel是一个轻量的python桌面GUI开发第三方库, 它使用HTML/JS作为界面开发语言, 但是能够访问所有的python功能, ...

  8. TI-89T 教你在C程序里调用TI-BASIC程序,看看是否有人对这个感兴趣

    2019独角兽企业重金招聘Python工程师标准>>> 教你在C 程序里调用TI-BASIC程序,看看是否有人对这个感兴趣 昨天翻TIGCC的文档,先瞅了瞅FAQ,话说我看文档有个习 ...

  9. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

最新文章

  1. 用递归法计算斐波那契数列的第n项
  2. PyTorch Trick集锦
  3. +7白盒测试与黑盒测试的定义与区别
  4. 《互联网运营智慧》终于上市销售了
  5. 当“天天酷跑”遇上“Python程序员” 另类演绎团战新玩法(学到了学到了~)
  6. 登录不上_无法登录远程:出现身份验证错误,要求的函数不受支持
  7. 神舟笔记本电源管理软件_笔记本电脑是一直插着电源好,还是拔了电源好?
  8. P4180-[BJWC2010]严格次小生成树【Kruskal,倍增】
  9. Forrester云原生开发者洞察白皮书,低代码概念缔造者又提出新的开发范式
  10. 【HUAWEI Mate30】抽奖啦!华为IoT新福利上线!
  11. 关于启动Activity之间的及普通按钮的点击事件
  12. Django开发利器——django-debug-toolbar
  13. 对抗样本生成算法-FGSM、I-FGSM、ILCM、PGD
  14. window.opener 与 window.dialogArguments的用法
  15. 2019年11月中华人民共和国县以上行政区划代码(用于身份证前六位判断户籍所在地)
  16. 7-4 新浪微博热门话题 (20 分) 新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还
  17. ntext字段的替换处理示例--全表替换
  18. UKF-协方差矩阵分解
  19. 内存存放方式_如何以正确的方式存放剩余涂料
  20. 车载电子 || 电池FPC连接片虚焊失效分析

热门文章

  1. C++之char , signed char , unsigned char
  2. JAVA-求整数序列中出现次数最多的数
  3. R7-1 新世界 (5 分)
  4. 7-210 英文单词排序 (25 分)
  5. 在Linux下使用Vim编写C++
  6. c 读取当前服务器的硬件参数,获取DHCP服务器的配置信息
  7. 飞信for linux,开源飞信 Openfetion for Linux
  8. mysql中的基本数据类型_mysql基本数据类型
  9. 计算机片段教学优秀教案,精彩教学片段100例—导入篇(1)
  10. PostGIS mysql_fdw安装(Linux)