爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10735|回复: 2

[源代码] Python写【windows服务】的实战案例

[复制链接]

新浪微博达人勋

发表于 2022-4-17 20:41:50 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2022-7-16 17:58 编辑

很多时候,我们需要某个程序持续运行,例如:爬虫程序、定期给客户发文件、给同事发工作计划、给自己发健身计划......

这种类似【网站后端】和【FTP】的一直运行的功能,叫做windows服务

何谓【windows服务】------
Microsoft Windows 服务使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

那如何用Python怎么写一个服务呢?

先得有一个脚本,例如PythonService.py,内容为:

import win32serviceutil
import win32service
import win32event

class PythonService(win32serviceutil.ServiceFramework):
    _svc_name_ = "weater"           # 服务名
    _svc_display_name_ = "weater"   # 服务显示名称
    _svc_description_ = "天气"       # 服务描述

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.run=True

    def SvcDoRun(self):
        import time
        # 如果self.run==True,则持续运行服务:
        while self.run:
            # 以下是按你的需要,执行的内容,
            # 当然,如果是打印一串字符串这种功能,服务立马就结束了
            # ======开始======
            x=1
            while True:
                fp=open(r'D:\service\test'+'\\'+str(x)+'.txt','w')
                print('成功啦-'+str(x),file=fp)
                fp.close()
                x=x+1
                time.sleep(10)
            # ======结束======
        win32event.WaitForSingleObject(self.hWaitStop,win32event.INFINITE)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.run = False

if __name__=='__main__':
    win32serviceutil.HandleCommandLine(PythonService)


然后,管理员模式打开cmd,
进入PythonService.py的目录:d: 回车,cd D:\service 回车
安装服务:python PythonService.py install,回车
这时,在windows的【服务】选项卡就能看到【weather】这个服务了
启动服务:python PythonService.py start,回车

这里我遇到一个问题,说启动不了,从网上搜答案,坑货一大堆,帖子你抄我,我抄你,都不对,浪费了我2个小时的时间,煎熬我的耐心,不过我一直没有放弃,因为Python写服务应该是一个非常基础的操作,非常成熟的技术,不可能搞不定。

最后还是自力更生解决的:

Python服务是由pythonservice.exe执行的,但双击该程序时,说找不到pywintypes38.dll,
于是,我就在Python的安装目录中搜索这个文件,
我在 C:\python\Lib\site-packages\pywin32_system32 下找到了这个文件,然后把这个目录加到了环境变量,
再双击pythonservice.exe就没说找不到了,
然后再执行服务启动命令,就成功了---在D:\service\test目录下,每10秒生成一个txt文本,表示成功了!

服务程序的产品.png

其他命令:
让服务自动启动:python PythonService.py --startup auto install
重启服务:python PythonService.py restart
停止服务:python PythonService.py stop
删除/卸载服务:python PythonService.py remove

目前存在的问题:
服务启动之后,停不下来,【服务】窗口中【weather】服务是没有启动/停止选项的,
启停服务.png


当然,这可能跟代码有关,但问题不大,以后再加深理解吧,至少服务能运行了。
~~撒花!~~

【后续补充】
卸载服务的方法(亲测可用):
sc delete 服务名
然后重启


密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2022-4-18 00:09:54 | 显示全部楼层
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-4-18 08:12:47 | 显示全部楼层
然后少了个h
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表