Shell腳本里調用Python程式
- 2020 年 1 月 9 日
- 筆記
腳本背景:主管要求看門狗程式不僅僅只是看門,還要在看門成功的時候發送郵件給各個開發人員,而且必須要用公司原有的python程式作為發送郵件的主程式,所以需要在原有的看門狗程式上加一句話,而這個看門狗程式恰恰是shell程式,兩種不同程式混搭交織,還有變數的混搭交織,很是讓人愛恨交織。
那個發送郵件的程式,程式名叫AutoMail.py,內容如下
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 sucessn') 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 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 sucessn') 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的變數了~~~
