一. 前言
有了上一篇的“python初學”的基礎,咱們就有了python的開發包,有了開發環境IDE,那我們就可以干活了。我的第一個選題就是讓我們的windows服務可以按照我們的意願進行自動重啟。
再說一下現在面臨的問題吧,我們公司的平台服務是是基於windows服務開發,那如果我想做更新時,就要有如下的步驟:
1. 停止正在運行的win服務。
2. 復制指定文件夾下的DLL,粘貼到目標路徑。
3. 刪除日志(便於查看啟動日志,當然刪不刪由你)
4. 重啟服務。
步驟很簡單,不過如果每次都這樣進行手工操作的話,那是不是有點笨拙了呢,用咱們軟件開發原則的話說:don't repeat yourself。
不過我也是新手,有不對的地方,還請大家指教啊,那我們現在就開始:
二.新建項目
找了半天,沒有找到新建項目的快捷鍵,不過可以使用alt+F,再加下箭頭回車,一樣可以,當然也可以自定義shortkey.我只裝了一個python3.3,python可以同時允許我們安裝多個版本的python,具體項目選擇哪個,可以在這里選擇。回車,項目就創建完了。

三. 新建python文件
快捷鍵:alt+insert 允許我們新建一個Directory,Python Package,但咱這個沒那么大,一個python File 就足夠了。

至於名字我也不糾結了,還是與項目名一樣吧,
后面那個__autthor是IDE給我自動生成的,你可以配置一下,讓它自動給生成什么,位置見下圖:

我看到很多人都在這里設置了字符編碼,不過目前我還沒有遇到過相關的問題,以后再說吧。
四。開始coding
在正式coding之前,我們先前分析一下,這個程序的運行過程:
1. 判斷一下,要拷貝的文件是否存在,不存在就什么都不用做了。
2. 判斷指定服務是否正在運行。(如果沒有運行,還就簡單了),如果運行,那就停掉它。
3. 判斷一下,日志文件是否存在,如存在,就刪除它。
4. copy DLL 文件到指定目錄。
5. 啟動服務。
好了,思路有了,開始編碼吧,直接上代碼:
1. 判斷一下,要拷貝的文件是否存在,不存在就什么都不用做了。初學python的要注意縮進,python是用縮進划定方法,類,甚至是if,else的作用域的。
import os
src = "C:\\CTIL\\dblogic\\dbLogic.dll"
if not os.path.exists(src):
exit()
2. 判斷指定服務是否正在運行。(如果沒有運行,還就簡單了),如果運行,那就停掉它。
這里我定義一個方法,主程序直接調用它就行了。這里插一句,好像寫python的人變量和方法,文件名,都習慣用小寫。
def stopservice(name):
result = os.popen("sc query %s" % name).read()
if "RUNNING" in result:
logger.info("The Service %s is running........" % name)
os.popen("sc stop %s" % name).read()
logger.info("Stop Service ........")
time.sleep(60)
elif "START_PENDING" in result:
logger.info("The Service %s is starting........" % name)
time.sleep(10)
os.popen("sc stop %s" % name).read()
logger.info("Stop Service ........")
time.sleep(10)
elif "STOP_PENDING" in result:
logger.info("The Service %s is stopping........" % name)
time.sleep(10)
elif "STOPPED" in result:
logger.info("The Service %s stopped........" % name)
else:
logger.info("The Service %s is in other status........" % name)
這里寫的有點啰嗦,主要是寫告訴大家,服務運行過程可能有多個狀態,咱們最好還是考慮全一些。這里呢,我加了日志記錄功能,以后有機會再和大家分享關於python日志方面的東東,這里還有一個方法,time.sleep(10),聰明的你一定知道它是什么意思了,這里不多說了。
3. 判斷一下,日志文件是否存在,如存在,就刪除它。直接上方法
def deleteFile(filepath): if os.path.isfile(filepath): try: os.remove(filepath) except: print("delete File failure: %s" % filepath) elif os.path.isdir(filepath): for item in os.listdir(filepath): itemsrc = os.path.join(filepath, item) deleteFile(itemsrc) try: os.rmdir(filepath) except: print("delete Folder failure: %s" % filepath)
這里有點小說明,就是這個deletefile方法的接收參數既可以是文件,也可以是文件夾,刪除呢也是采用兩種方式。還里還有一個小的異常處理,有點小特別吧。
4. copy DLL 文件到指定目錄。
這個也是比較簡單:
shutil.copyfile(src, target)
5. 啟動服務。
def startservice(name): logger.info("The Service %s is starting....... " % name) os.popen("sc start %s" % name).read() time.sleep(60) result = os.popen("sc query %s" % name).read() if "RUNNING" in result: logger.info("The Service started Succesivlly")
五. 部署
代碼寫完了,調試幾個,就可以運行了,那么如何把它放在服務器上運行呢,一開始我想是不是也要打個包什么的呢,也找了些工具,不過后來,我想這么小的東西,還是直接放上去得了,大不了安裝一下python。
六. 結語
我的第一個Python項目就完成了,沒有把完整代碼發出來,是想讓大家都親手都實踐一下。
歡迎大家討論。
