网站首页 > 开源技术 正文
在Windows中,没有用户界面的后台进程被称为服务。这些服务可以通过标准的Windows控制方式(如命令提示符、PowerShell或任务管理器中的服务选项卡)进行控制(启动、停止等)。一个很好的例子可能是提供网络服务的应用程序,例如Web应用程序,或者是一个执行各种后台归档任务的备份应用程序。有几种方法可以在Windows中将Python应用程序创建并安装为服务。
1: 可以作为服务运行的Python脚本
本示例中使用的模块是pywin32(Python for Windows扩展)的一部分。根据你的Python安装方式,你可能需要单独安装它。
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
pass
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
这只是样板代码。你的应用程序代码(可能调用一个单独的脚本)将放在main()函数中。
你还需要将此服务安装为服务。目前,最好的解决方案似乎是使用Nonsucking Service Manager。这允许你安装服务,并提供一个GUI来配置服务执行的命令行。对于Python,你可以这样做,这将一次性创建服务:
nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
其中myscript.py是上面的样板脚本,修改为在main()函数中调用你的应用程序脚本或代码。注意,服务不会直接运行Python脚本,它运行Python解释器,并将主脚本作为命令行参数传递给它。
或者,你可以使用Windows Server Resource Kit中为你的操作系统版本提供的工具来创建服务。
2: 作为服务运行Flask Web应用程序
这是通用示例的一个变体。你只需要导入你的应用程序脚本,并在服务的main()函数中调用它的run()方法。在这个例子中,我们还使用了multiprocessing模块,因为访问WSGIRequestHandler时存在问题。
import win32serviceutil
import win32service
import win32event
import servicemanager
from multiprocessing import Process
from app import app
class Service(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
_svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe"
def __init__(self, *args):
super().__init__(*args)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.process.terminate()
self.ReportServiceStatus(win32service.SERVICE_STOPPED)
def SvcDoRun(self):
self.process = Process(target=self.main)
self.process.start()
self.process.run()
def main(self):
app.run()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(Service)
猜你喜欢
- 2025-03-10 python散装笔记——122: Websockets
- 2025-03-10 【Python深度学习系列】Win10下CUDA+cuDNN+Tensorflow安装与配置
- 2025-03-10 简单易学的python编程离不开运行环境,飞雨教你如何安装Python
- 2025-03-10 这是我见过最好的Python教程:十分钟带你认识Python
- 2025-03-10 如何下载并安装Python
- 2025-03-10 Python开发:Win10创建定时任务执行Python脚本
- 2025-03-10 持续集成自动化框架Jenkins+Allure+Git+Python 在windows下的部署
- 2025-03-10 Python与PyOpenGL概述
- 2025-03-10 Python+C混合编程:5大高效开发场景揭秘
- 2025-03-10 美化Python GUI界面!让你的窗口拥有Win11般的质感 | pywinstyles
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)