windows平臺(tái)把python程序制作成windows服務(wù)并開(kāi)機(jī)啟動(dòng)(實(shí)踐的坑)

簡(jiǎn)介


通常在windows平臺(tái)上開(kāi)發(fā)完python服務(wù)后撵割,需要通過(guò)引用虛擬環(huán)境后再運(yùn)行奠宜,或者使用IDE軟件啟動(dòng)哗讥,但如果想做成開(kāi)機(jī)啟動(dòng)的本地服務(wù)嚷那,每次都這樣啟動(dòng)就太麻煩了。?

該文檔介紹這個(gè)方法是把python程序制作成一個(gè)windows忌栅,啟停特別方便车酣,而且還可以設(shè)置開(kāi)機(jī)啟動(dòng)。虛擬環(huán)境依賴(lài)的庫(kù)也不需要考慮索绪,只要在構(gòu)建的時(shí)候在虛擬環(huán)境下構(gòu)建湖员,就會(huì)自動(dòng)將依賴(lài)的庫(kù)打包進(jìn)去。


1瑞驱、首先娘摔,有一段大家通用的代碼,可以將python程序制作成服務(wù)唤反。直接拷貝使用即可凳寺,在SvcDoRun函數(shù)內(nèi)寫(xiě)上拉起自己服務(wù)的代碼。


# -*- coding:utf-8 -*-

import win32serviceutil

import win32service

import win32event

import sys

import os

#設(shè)置編碼

reload(sys)

sys.setdefaultencoding('utf-8')

#windows服務(wù)中顯示的名字

class zlsService(win32serviceutil.ServiceFramework):

_svc_name_ ='web_movie' ###可以根據(jù)自己喜好修改

? ? _svc_display_name_ ='web_movie'? ###可以根據(jù)自己喜好修改

? ? _svc_description_ ='web_movie'? ###可以根據(jù)自己喜好修改

? ? def __init__(self,args):

win32serviceutil.ServiceFramework.__init__(self,args)

self.stop_event = win32event.CreateEvent(None,0,0,None)

self.run =True

? ? def SvcDoRun(self):

# 這里是你的啟動(dòng)代碼彤侍,由于我的是flask框架程序肠缨,只需要把我的主文件from過(guò)來(lái)即可。

from web_movieimport app

app.run()

def SvcStop(self):

self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)

win32event.SetEvent(self.stop_event)

self.ReportServiceStatus(win32service.SERVICE_STOPPED)

self.run =False

if __name__ =='__main__':

import sys

import servicemanager

if len(sys.argv) ==1:

try:

evtsrc_dll = os.path.abspath(servicemanager.__file__)

servicemanager.PrepareToHostSingle(zlsService)#如果修改過(guò)名字盏阶,名字要統(tǒng)一

? ? ? ? ? ? servicemanager.Initialize('zlsService',evtsrc_dll)#如果修改過(guò)名字晒奕,名字要統(tǒng)一

? ? ? ? ? ? servicemanager.StartServiceCtrlDispatcher()

except win32service.erroras details:

import winerror

if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:

win32serviceutil.usage()

else:

win32serviceutil.HandleCommandLine(zlsService)#如果修改過(guò)名字,名字要統(tǒng)一


2名斟、安裝構(gòu)建環(huán)境需要用的庫(kù)脑慧,在虛擬環(huán)境內(nèi)安裝即可。


pip install PyInstaller==3.4

pip install pywin32==224


3砰盐、編寫(xiě)構(gòu)建bat闷袒,其實(shí)就幾個(gè)cmd命令,但是為了方便調(diào)試岩梳,我還是寫(xiě)成了一個(gè)腳本囊骤。


:: 停止運(yùn)行的服務(wù)

sc stop web_movie

:: 刪除這個(gè)服務(wù)

sc delete web_movie

:: 等個(gè)幾秒鐘晃择,服務(wù)剛停止,文件不會(huì)馬上釋放也物,不然文件不讓刪除

TIMEOUT /T 3

:: 刪除舊版本構(gòu)建的內(nèi)容

rmdir /s/q dist

rmdir /s/q build

del PythonService.spec

:: 構(gòu)建現(xiàn)在的程序藕各,這里有個(gè)坑,由于templates目錄和static目錄和代碼不是直接引用焦除,在pyinstaller構(gòu)建的時(shí)候會(huì)忽略激况,導(dǎo)致服務(wù)無(wú)法運(yùn)行,后面詳細(xì)介紹膘魄。

pyinstaller -F --add-data "templates;templates" --add-data "static;static" PythonService.py

:: 將構(gòu)建好的exe程序安裝到系統(tǒng)服務(wù)

dist\PythonService.exe install

:: 啟動(dòng)服務(wù)

sc start web_movie


4乌逐、這時(shí)候在任務(wù)管理器里面就可以看到已經(jīng)運(yùn)行的服務(wù)了


5、如果不能啟動(dòng)创葡,排查方法


如果啟動(dòng)后立即停止浙踢,或者彈窗說(shuō)“服務(wù)沒(méi)有及時(shí)響應(yīng)啟動(dòng)或控制請(qǐng)求”,這時(shí)候可以查看windows的計(jì)算機(jī)管理界面應(yīng)用日志灿渴,來(lái)看詳細(xì)信息洛波。

6、我遇到的坑


Traceback (most recent call last):

File "site-packages\win32\lib\win32serviceutil.py", line 839, in SvcRun

File "PythonService.py", line 28, in SvcDoRun

File "site-packages\flask\app.py", line 943, in run

File "site-packages\werkzeug\serving.py", line 812, in run_simple

File "site-packages\werkzeug\_reloader.py", line 267, in run_with_reloader

ValueError: signal only works in main thread

上面這個(gè)報(bào)錯(cuò)使我的代碼出現(xiàn)過(guò)得骚露,經(jīng)過(guò)我的各種最小化測(cè)試蹬挤,發(fā)現(xiàn)這個(gè)錯(cuò)誤是加載配置項(xiàng)的時(shí)候就會(huì)出現(xiàn),最終定位到了我的一行配置文件棘幸。

DEBUG =True焰扳,這一行配置讓我排查了整整一天。


7误续、我遇到的坑


修復(fù)了上面的問(wèn)題吨悍,我的的服務(wù)終于起來(lái)了,但是又發(fā)現(xiàn)蹋嵌,在瀏覽器里面竟然無(wú)法訪問(wèn)育瓜。如下提示:

Internal Server Error

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

這個(gè)問(wèn)題也讓我苦惱了很久,在我最小化測(cè)試的時(shí)候栽烂,縮減到僅剩一個(gè)hello world都無(wú)法正常顯示躏仇,但是創(chuàng)建一個(gè)新的flask項(xiàng)目就可以正常顯示,經(jīng)過(guò)我細(xì)心的diff這兩個(gè)項(xiàng)目愕鼓,

發(fā)現(xiàn)我在return的時(shí)候使用了render_template模板钙态,然而這個(gè)目錄在pyinstaller的時(shí)候慧起,并沒(méi)有打包進(jìn)來(lái)菇晃,然后這一切都明白了,就是因?yàn)樵跇?gòu)建的時(shí)候沒(méi)有將這個(gè)目錄添加進(jìn)來(lái)蚓挤,

導(dǎo)致項(xiàng)目啟動(dòng)后無(wú)法使用模板文件磺送。

修復(fù)方法就是bat文件內(nèi)寫(xiě)的驻子,添加上靜態(tài)目錄的編譯就可以了。

pyinstaller -F --add-data "templates;templates" --add-data "static;static" PythonService.py

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末估灿,一起剝皮案震驚了整個(gè)濱河市崇呵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馅袁,老刑警劉巖域慷,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汗销,居然都是意外死亡犹褒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)弛针,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叠骑,“玉大人,你說(shuō)我怎么就攤上這事削茁≈婕希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵茧跋,是天一觀的道長(zhǎng)慰丛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瘾杭,這世上最難降的妖魔是什么璧帝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮富寿,結(jié)果婚禮上睬隶,老公的妹妹穿的比我還像新娘。我一直安慰自己页徐,他們只是感情好苏潜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著变勇,像睡著了一般恤左。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搀绣,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天飞袋,我揣著相機(jī)與錄音,去河邊找鬼链患。 笑死巧鸭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麻捻。 我是一名探鬼主播纲仍,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呀袱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了郑叠?” 一聲冷哼從身側(cè)響起夜赵,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乡革,沒(méi)想到半個(gè)月后寇僧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沸版,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年婉宰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片推穷。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡心包,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馒铃,到底是詐尸還是另有隱情蟹腾,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布区宇,位于F島的核電站娃殖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏议谷。R本人自食惡果不足惜炉爆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卧晓。 院中可真熱鬧芬首,春花似錦、人聲如沸逼裆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胜宇。三九已至耀怜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桐愉,已是汗流浹背财破。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留从诲,地道東北人左痢。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抖锥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 0 前言 = 瞎說(shuō) 能寫(xiě)web的語(yǔ)言有好多碎罚。python算是難度較低磅废,入門(mén)較快的腳本語(yǔ)言。Django是pytho...
    hubery24閱讀 2,055評(píng)論 0 3
  • 接口測(cè)試自動(dòng)化的優(yōu)點(diǎn): 1荆烈,web自動(dòng)化說(shuō)起來(lái)很多人都會(huì)直接想到UI自動(dòng)化這個(gè)設(shè)計(jì)拯勉,很少有人直接第一個(gè)概念是接口自...
    路邊看雪的小男孩閱讀 4,921評(píng)論 1 26
  • [TOC] 最開(kāi)始寫(xiě)程序的時(shí)候,都是一個(gè)文件里輸入幾行源碼(python 的一個(gè) web 框架bottle就特別強(qiáng)...
    人世間閱讀 5,499評(píng)論 1 10
  • 心理線(PSY)是一個(gè)比較“冷門(mén)”的技術(shù)指標(biāo)憔购, 投資者對(duì)它的實(shí)際運(yùn)用不多宫峦,甚至連錢(qián)龍動(dòng)態(tài)分析軟件里也沒(méi)有心理線,可...
    朱水火閱讀 243評(píng)論 0 1
  • spearman秩相關(guān)系數(shù) pearson線性相關(guān)系數(shù)要求連續(xù)變量的取值服從正態(tài)分布玫鸟。不服從正態(tài)分布的變量导绷、分類(lèi)或...
    AliceGYY閱讀 685評(píng)論 0 0