把python項目制作成windows服務並一鍵部署


把python項目制作成windows服務並一鍵部署
原創Li-boss 最后發布於2019-11-23 14:06:28 閱讀數 65 收藏
展開
制作windows服務
大家都遇到過把自己開發的項目打包成相應的服務。在windows中快速部署。針對這個問題,我整理了一個思路,不管是html和python代碼都是可以實現打包來封裝部署的。這樣做的好處是能夠把自己開發的東西做成windows可以運行的exe文件,並且能夠做成可以起停的系統服務。方便我們管理。

作者:lizhonglin
github: https://github.com/Leezhonglin/
blog: https://leezhonglin.github.io/

具體制作步驟如下:

1.准備好需要的文件
li-boss-service.exe
li-boss-service-def.xml
li-boss-service.exe.xml
1
2
3
這是注冊服務的必須的三個有了它最終才呢個實現該服務的注冊。

2.修該配置文件
li-boss-service-def.xml需要我們進行修改,修改成我們需要的信息。具體修改如下

<?xml version="1.0" encoding="UTF-8"?>
<service>
<id>LiBoss</id> <!--服務id-->
<name>LiBoss</name> <!--服務名稱-->
<description>LiBoss Service</description> <!--服務描述信息-->
<logpath>%BASE_PATH%\logs</logpath> <!--服務日志信息保存路徑-->
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
<executable>%BASE_PATH%\run.exe</executable> <!--執行文件的絕對路徑-->
<startarguments>-p %BASE_PATH%</startarguments>
<stopexecutable>%BASE_PATH%</stopexecutable>
<stoparguments>-p %BASE_PATH% -s stop</stoparguments>
</service>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我們需要替換%BASE_PATH% 的內容為自己要啟動的服務的路徑即可。

注意:如果自己知道執行文件的路徑就可以手動修改配置文件li-boss-service-def.xml里面的內容為自己的實際內容。然后保存為一個新的文件名稱為li-boss-service.xml才能使用。

---------------------------分割線------------------------------------------------------------------

實際實現的案例
1.步驟一
我想注冊一個服務名稱叫LiBoss的服務在系統中。這個LiBoss服務是python的一個簡單flask項目打包后的服務。

flask項目代碼如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*
"""
@author:li-boss
@file_name: start_app.py
@create date: 2019/11/15 23:00
@blog https://leezhonglin.github.io
@csdn https://blog.csdn.net/qq_33196814
@file_description:簡單的flask應用
"""


from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return '<h1>Hello Li-boss!!!</h1>'

if __name__ == '__main__':
app.run()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
使用python的pyinstaller來打包exe.

pyinstaller -F start_app.py
1
項目打包成功后有如下文件:

 

這樣項目的內容就打包成exe的執行文件了。

我們可以進入dist目錄執行start_app.exe來啟動項目。

執行結果如下:

 

這樣我們就可以通過瀏覽器來訪問我們的項目

 

看到上面的就過我們的打包基礎工作就已經成功。這樣就有新的問題產生了,我們要運行項目的話每次都需要手動來點擊這個start_app.exe文件。而且還有一個小黑框出現。就達不到方便使用的效果。為此我們要正式進入主題。制作服務,我么最終的目的就是把這個項目通過windows打包工具封裝成一個安裝完成后可以根據系統的啟動自動啟動服務 我么能非常方便的停止服務。向windows自帶的服務一樣。由於我們安裝的最終路徑都不能確定所以我們需要完成安裝完成后自動修改服務的配置文件。因此我通過python代碼來實現自動修改配置文件。

2.步驟二
修改配置文件的python代碼

#!/usr/bin/python
# -*- coding: UTF-8 -*
"""
@author:li-boss
@file_name: in_service.py
@create date: 2019/11/23 10:43
@blog https://leezhonglin.github.io
@csdn https://blog.csdn.net/qq_33196814
@file_description:修改服務配置文件
"""

import os


def create_new_file(file_name, new_file_name, old_str, new_str):
"""
修改修改python配置文件
:param file_name: 被打開的文件的路徑
:param new_file_name: 修改后生成的新文件的路徑
:param old_str: 舊的字符串
:param new_str: 新字符串
:return:
"""
# encoding根據具體的系統來確定 如果是windows創建的記事本請用gbk
fo = open(file_name, 'r+')
results = []
link = fo.readlines()
for fileLine in link:
str = fileLine.replace(old_str, new_str)
results.append(str)
# print('>>', fileLine.strip())
fo.close()

# 獲取的新數據寫入新文件中
# encoding根據具體的系統來確定 如果是windows創建的記事本請用gbk
new_fo = open(new_file_name, 'w+')
for str in results:
new_fo.write(str)
new_fo.close()
# print('修改完成')


if __name__ == "__main__":
# 當前的工作目錄
# path = os.getcwd()
# 打包用的路徑修改路徑
path = os.path.abspath('..') + r"\dist"

# VHost_CONF配置路徑
csips_server_conf = path + r"\li-boss-service-def.xml"
# 定義舊的字符串
old_str = "%BASE_PATH%"

new_server_file = path + "\li-boss-service.xml"

# 生成vhost配置文件
create_new_file(csips_server_conf, new_server_file, old_str, path)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
代碼完成后一樣我們需要通過pyinstaller來打包。打包完后如下:

 

3.步驟三
把步驟二的和步驟一的結果放一起。結果如下:

 

4.步驟四
把服務需要的那個三個文件拷貝到dist目錄下面如下圖:

 

5.步驟五
添加安裝/卸載bat文件

安裝

@ echo off
%1 %2
ver|find "5.">nul&&goto :Admin
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
:Admin


:: 切換目錄
cd "%~dp0/dist/"
:: 執行in_service.exe
"in_service.exe"
@echo ------------------install start-------------------------!

:: 停止服務
net stop LiBoss
:: 刪除服務
sc delete LiBoss
:: 注冊服務
"%~dp0/dist/li-boss-service.exe" install
:: 啟動服務
net start LiBoss

@echo ------------------install ok----------------------------!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
卸載

@echo ------------------uninstall start-------------------------!
net stop LiBoss
sc delete LiBoss

@echo ------------------uninstall ok----------------------------!

del %0

1
2
3
4
5
6
7
8
6.步驟六
添加軟件的license.txt

內容

版權歸li-boss所有
未經授權不得使用.
1
2
7.步驟七
制作windows封裝exe的腳本,我這里使用nsis v2.51為例.具體打包過程見文章《NSIS打包electron生成的文件為exe安裝包》。

這里不做過多的說明。

; 該腳本使用 HM VNISEdit 腳本編輯器向導產生

; 安裝程序初始定義常量
!define PRODUCT_NAME "Li-Boss Service"
!define PRODUCT_VERSION "1b32dc1 v1.0"
!define PRODUCT_PUBLISHER "Li-boss, Inc."
!define PRODUCT_WEB_SITE "https://leezhonglin.github.io"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

SetCompressor lzma

; ------ MUI 現代界面定義 (1.67 版本以上兼容) ------
!include "MUI.nsh"

!include "Library.nsh"
!include "x64.nsh"

;自動識別系統是32位還是64位
!define LIBRARY_X64
!ifdef LIBRARY_X64
!define PROGRAMFILES_MAP $PROGRAMFILES64
!else
!define PROGRAMFILES_MAP $PROGRAMFILES
!endif

; MUI 預定義常量
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; 歡迎頁面
!insertmacro MUI_PAGE_WELCOME
; 許可協議頁面
!insertmacro MUI_PAGE_LICENSE "C:\Users\li-boss\Desktop\li-boss\Licence.txt"
; 安裝目錄選擇頁面
!insertmacro MUI_PAGE_DIRECTORY
; 安裝過程頁面
!insertmacro MUI_PAGE_INSTFILES
; 安裝完成頁面
!insertmacro MUI_PAGE_FINISH

; 安裝卸載過程頁面
!insertmacro MUI_UNPAGE_INSTFILES

; 安裝界面包含的語言設置
!insertmacro MUI_LANGUAGE "SimpChinese"

; 安裝預釋放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 現代界面定義結束 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "li-boss-service.exe"
InstallDir "$PROGRAMFILES\Li-Boss Service"
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
SetOutPath "$INSTDIR"
SetOverwrite ifnewer
File /r "C:\Users\li-boss\Desktop\li-boss\*.*"
SectionEnd

Section -AdditionalIcons
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateDirectory "$SMPROGRAMS\Li-Boss Service"
CreateShortCut "$SMPROGRAMS\Li-Boss Service\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut "$SMPROGRAMS\Li-Boss Service\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd

/******************************
* 以下是安裝程序的卸載部分 *
******************************/

Section Uninstall
# 卸載的時候先執行刪除服務
nsExec::Exec '$INSTDIR\unInstall.bat'
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"

Delete "$SMPROGRAMS\Li-Boss Service\Uninstall.lnk"
Delete "$SMPROGRAMS\Li-Boss Service\Website.lnk"
Delete "$INSTDIR\*.*"

RMDir "$SMPROGRAMS\Li-Boss Service"

RMDir /r "$INSTDIR\dist"
RMDir /r "$INSTDIR\build"

RMDir "$INSTDIR"

DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true
SectionEnd

#-- 根據 NSIS 腳本編輯規則,所有 Function 區段必須放置在 Section 區段之后編寫,以避免安裝程序出現未可預知的問題。--#

 

Function .onInstSuccess
# 安裝完成自動執行服務注冊
nsExec::Exec '$INSTDIR/Install.bat'
Abort

FunctionEnd

Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確實要完全移除 $(^Name) ,及其所有的組件?" IDYES +2
Abort
FunctionEnd

Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地從您的計算機移除。"
FunctionEnd

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
打包完成后:

在這里插入圖片描述
運行完之后,查看系統服務就有一個名稱為LiBoss的服務。

 

到這里制作的服務已經完成。

注意:上面的三個文件的后綴為xml的在windows中需要注意編碼,一定是ANSI
————————————————
版權聲明:本文為CSDN博主「Li-boss」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33196814/article/details/103213558


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM