Shell脚本里调用Python程序

简介:

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 :
         =  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

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

wKiom1ey02SB1TWLAAAgqBgsSt4216.png


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 :
         =  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

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



 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1839279
相关文章
|
3天前
|
分布式计算 Hadoop Shell
使用shell脚本实现自动SSH互信功能
使用shell脚本实现自动SSH互信功能
10 1
|
2天前
|
Python
【Python进阶(二)】——程序调试方法
【Python进阶(二)】——程序调试方法
|
2天前
|
Python
Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。
Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。在函数内部修改全局变量需用`global`关键字声明,否则会创建新局部变量。
9 2
|
2天前
|
Python Perl
LabVIEW调用Perl和Python脚本
LabVIEW调用Perl和Python脚本
|
4天前
|
Unix Shell Linux
轻松编写 AIX Shell 脚本
轻松编写 AIX Shell 脚本
12 1
|
4天前
|
缓存 人工智能 算法
编写高效的Python脚本:性能优化的策略与技巧
编写高效的Python脚本需要综合考虑多个方面,包括代码结构、数据结构和算法选择等。本文将探讨在Python编程中提高脚本性能的方法,包括优化数据结构、选择合适的算法、使用Python内置函数以及通过并行和异步编程提升效率。这些技巧旨在帮助开发者在不同应用场景中编写出高性能的Python代码。
|
5天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
5天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份
|
5天前
|
消息中间件 程序员 调度
Python并发编程:利用多线程提升程序性能
本文探讨了Python中的并发编程技术,重点介绍了如何利用多线程提升程序性能。通过分析多线程的原理和实现方式,以及线程间的通信和同步方法,读者可以了解如何在Python中编写高效的并发程序,提升程序的执行效率和响应速度。
|
6天前
|
缓存 Shell 开发工具
[oeasy]python0016_在vim中直接运行python程序
在 Vim 编辑器中,可以通过`:!`命令来执行外部程序,例如`:!python3 oeasy.py`来运行Python程序。如果想在不退出Vim的情况下运行当前编辑的Python文件,可以使用`%`符号代表当前文件名,所以`:!python3 %`同样能运行程序。此外,可以使用`|`符号连续执行命令,例如`:w|!python3 %`会先保存文件(`w`)然后运行Python程序。这样,就可以在不离开Vim的情况下完成编辑、保存和运行Python程序的流程。
16 0