导航

以windows service的方式运行Python程序

Posted on 2009-07-02 12:24  Eineseite  阅读(5935)  评论(4编辑  收藏  举报

    自从上次写了那篇《待机唤醒后自动连接宽带》后,就尝试用刚学的Python来实现那个功能了,语句很简单,要用到Tim Golden编写的wmi.py 和 Mark Hammond的win32 extensions for Python ,两个缺一不可。

code:

import wmi
import os
= wmi.WMI()
watcher 
= c.Win32_PowerManagementEvent.watch_for(EventType=7# 监视待机事件;
while True:
   
os.system("kdlj.vbs"# 运行“连接宽带“的程序,这里还是用了上次那位仁兄的vbs代码;
   
watcher()
   

 

    由于运行时Python的控制台窗口一直在那儿,看着有点碍事儿。于是乎想到要是能把他以
windows service的方式运行,就像其他在windows服务管理器里的程序一样。

    最终,在"Python Programming On Win32"(by Mark Hammond)这本书里找到了相关介绍,它里
面有一个简单的模版,把程序代码放入相应位置就可以了:

# SmallestService.py
#
#
 A sample demonstrating the smallest possible service written in Python.

import win32serviceutil
import win32service
import win32event

class SmallestPythonService(win32serviceutil.ServiceFramework):
    _svc_name_ 
= "SmallestPythonService"
    _svc_display_name_ 
= "The smallest possible Python Service"
    
def __init__(self, args):
        win32serviceutil.ServiceFramework.
__init__(self, args)
        
# Create an event which we will use to wait on.
        # The "service stop" request will set this event.
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    
def SvcStop(self):
        
# Before we do anything, tell the SCM we are starting the stop process.
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        
# And set my event.
        win32event.SetEvent(self.hWaitStop)

    
def SvcDoRun(self):
        
# 把你的程序代码放到这里就OK了
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

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

    #
括号里的名字可以改成其他的,必须与class名字一致;

   

    接下来,只要安装一下服务,cmd下运行:SmallestService.py install 就行了。
这样,你就可以在
windows服务管理器里找到一个名叫"The smallest possible Python Service"的服
务了,设成自动启动,就会开机自动启动并且一直在后台运行了。(眼不见心不烦,

   不过,这样虽然达到目的了,但还是发现个小问题,就是要是想停止该服务,关闭的进度条就愣在那里不动了,必须在进程管理器里把pythonservice.exe关掉才行,这个bug一直没法解决,就是关闭服务的同时,要把监视待机事件取消,否则退不出这个死循环。要是哪位高人看到了,希望可以指点一二。