`
siu23
  • 浏览: 17196 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

安装程序时间同步小工具(Python + Windows Service + NSIS) 安装程序

阅读更多

时光紧张,先记一笔,后续优化与完善。

    家里有台很多年前买的电脑,CMOS电池残废了,经常碰到开机后系统时光被重置的情况,老妈向我反应用起来很不便利。于是身为一个程序员的我想到写个小具工来帮老妈排难解纷。话不多说,小具工需求如下:
功能需求 -- 电脑开机后动自执行时光同步
非功能需求 -- 安装执行单简,无需安装额定境环

    

一、码代实现

    基于以上需求,思绪如下:拜访络网取获北京时光,然后调用命令行来设置系统时光。程序写成Windows Service,并设置为开机动自行运。恰好前段时光在学习Python,所以算打用Python来写这个具工。体具码代如下:

取获络网时光
 1 def getBeijinTime():
 2     """
 3    取获北京时光
 4     """
 5     try:
 6         conn = httplib.HTTPConnection("www.beijing-time.org")
 7         conn.request("GET", "/time.asp")
 8         response = conn.getresponse()
 9         print response.status, response.reason
10         if response.status == 200:
11             #剖析应响的消息
12             result = response.read()
13             logging.debug(result)
14             data = result.split("\r\n")
15             year = data[1][len("nyear")+1 : len(data[1])-1]
16             month = data[2][len("nmonth")+1 : len(data[2])-1]
17             day = data[3][len("nday")+1 : len(data[3])-1]
18             #wday = data[4][len("nwday")+1 : len(data[4])-1]
19             hrs = data[5][len("nhrs")+1 : len(data[5])-1]
20             minute = data[6][len("nmin")+1 : len(data[6])-1]
21             sec = data[7][len("nsec")+1 : len(data[7])-1]
22             
23             beijinTimeStr = "%s/%s/%s %s:%s:%s" % (year, month, day, hrs, minute, sec)
24             beijinTime = time.strptime(beijinTimeStr, "%Y/%m/%d %X")
25             return beijinTime 
26     except:
27         logging.exception("getBeijinTime except")
28         return None
同步地本系统时光
 1 def syncLocalTime():
 2     """
 3     同步地本时光
 4     """
 5     logging.info("current local time is: %d-%d-%d %d:%d:%d" % time.localtime()[:6])
 6     
 7     beijinTime = getBeijinTime() 
 8     if beijinTime is None:
 9         logging.info("get beijinTime is None, will try again in 30 seconds...")
10         timer = threading.Timer(30.0, syncLocalTime)
11         timer.start();
12     else:
13         logging.info("get beijinTime is: %d-%d-%d %d:%d:%d" % beijinTime[:6])
14             
15         tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec = beijinTime[:6]
16         import os
17         os.system("date %d-%d-%d" % (tm_year, tm_mon, tm_mday))     #设置日期
18         os.system("time %d:%d:%d.0" % (tm_hour, tm_min, tm_sec))    #设置时光
19         logging.info("syncLocalTime complete, current local time: %d-%d-%d %d:%d:%d \n" % time.localtime()[:6])

二、署部安装

    为了让Python程序能以Windows务服的式方行运,要需用到py2exe(用来把Python程序编译成exe)和Python Win32 Extensions 。(py2exe把Python码代编译成Winodws务服时依附此件组)载下并安装这两个件组。安装毕完后,在Python的安装目录下找到py2exe的Windows Service示例({PythonRoot}\Lib\site-packages\py2exe\samples\advanced\MyService.py)。然后照仿这个示例将上面的码代完善一下。

Windows务服示例
 1 import win32serviceutil
 2 import win32service
 3 import win32event
 4 import win32evtlogutil
 5 
 6 class SynctimeService(win32serviceutil.ServiceFramework):
 7     _svc_name_ = "Synctime"
 8     _svc_display_name_ = "Synctime"
 9     _svc_description_ = "Synchronize local system time with beijin time"
10     _svc_deps_ = ["EventLog"]
11     
12     def __init__(self, args):
13         win32serviceutil.ServiceFramework.__init__(self, args)
14         self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
15 
16     def SvcStop(self):
17         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
18         win32event.SetEvent(self.hWaitStop)
19 
20     def SvcDoRun(self):
21         import servicemanager
22           
23         # Write a 'started' event to the event log...
24         win32evtlogutil.ReportEvent(self._svc_name_,
25                                     servicemanager.PYS_SERVICE_STARTED,
26                                     0, # category
27                                     servicemanager.EVENTLOG_INFORMATION_TYPE,
28                                     (self._svc_name_, ''))
29 
30         # wait for beeing stopped...
31         win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
32 
33         # and write a 'stopped' event to the event log.
34         win32evtlogutil.ReportEvent(self._svc_name_,
35                                     servicemanager.PYS_SERVICE_STOPPED,
36                                     0, # category
37                                     servicemanager.EVENTLOG_INFORMATION_TYPE,
38                                     (self._svc_name_, ''))   
39 
40 if __name__ == '__main__':
41     # Note that this code will not be run in the 'frozen' exe-file!!!
42     win32serviceutil.HandleCommandLine(SynctimeService)  

后之,再编写一个steup.py文件用来生成安装文件。

Setup.py
 1 from distutils.core import setup
 2 import py2exe
 3 
 4 setup(
 5     # The first three parameters are not required, if at least a
 6     # 'version' is given, then a versioninfo resource is built from
 7     # them and added to the executables.
 8     version = "0.0.1",
 9     description = "Synchroniz local system time with beijin time",
10     name = "sysctime",
11 
12     # targets to build
13     # console = ["synctime.py"],
14     service=["synctime"]
15 )

编译生成windows程序,如下图:

    

    然后在控制台中行运:setup.py py2exe ,一切顺利的话会在当前目录下生成build和dist目录。

    

    控制台目录切换到dist目录,找到synctime.exe,在命令行中行运:

    synctime.exe –install (-remove)  安装或移除时光同步务服。

    现在可以行运services.msc查看务服行运情况

    

    可以看到务服并没有启动,而且启动式方为手动。在这里可以右击务服选择属性手动把务服启动起来,并且设置为务服动自启动。

    好吧,我承认。这样操作跟上面的需求有点出入了,略显麻烦。为了解决这个问题,自然想到的是用批处理来做。在dist目录下分别建两个批处理文件:

installservice.bat
 1 @echo off
 2 
 3 :: 安装windows务服
 4 echo 正在安装务服,请稍候...
 5 synctime.exe -install
 6 
 7 :: 设置务服动自启动
 8 echo 正在启动务服...
 9 sc config Synctime start= AUTO
10 
11 :: 启动务服
12 sc start Synctime
13 
14 echo 务服启动成功, 按任意键继续...
15 pause
removeserivce.bat
 1 @echo off
 2 
 3 :: 停止务服
 4 echo 正在停止务服,请稍候...
 5 sc stop Synctime
 6 
 7 echo 正在卸载务服...
 8 :: 删除windows务服
 9 synctime.exe -remove
10 
11 echo 务服卸载完成,请按任意键继续剩余卸载...
12 pause


好了,现在可以把dist打个包发给老妈用了。但是,这样发个一个压缩包,看起来也太不专业了。解决的办法是打一个安装包,把bat脚本打到安装包里,在安装程序时由安装包调用。这里我用的是NISI(使用HM VNISEdit打包向导来生成打包脚本非常便利)。

    

三、最终安装效果图

    

    

    

    

    

四、结尾

    遗留的问题:

    1、从上面的截图可以看到,安装程序在调用批处理时会显示出控制台窗口。这个问题我在网上查找资料,NSIS有相关的插件可以隐藏控制台窗口调用bat文件。

    2、我源码代中有写日志文件的操作,但是以Windows务服的式方行运后,日志文件不能写了,不知道有没有好的解决办法。

    3、360 ...真是要人命啊....Orz..

 

    最后附上源码代及时光同步具工安装包

 

    版权说明:本文章版权归本人及博客园共同所有,未经允许请勿用于任何商业用途。转载请标明原文出处:

    http://www.cnblogs.com/talywy/archive/2013/03/07/SynctimeTool.html

文章结束给大家分享下程序员的一些笑话语录: 看新闻说中国输入法全球第一!领先了又如何?西方文字根本不需要输入法。一点可比性都没有。

分享到:
评论

相关推荐

    NSIS+Duilib自定义安装程序

    NSIS (Nullsoft Scriptable Install System) 是一个流行的开源安装制作工具,主要用于创建Windows平台上的安装、卸载程序。它支持脚本编写,允许开发者通过简单的语法实现复杂的安装逻辑。NSIS提供了丰富的功能,如...

    NSIS+Duilib 自定义安装程序

    【NSIS+Duilib 自定义安装程序】 NSIS(Nullsoft Scriptable Install System)是一款流行的开源安装制作系统,它允许开发者使用脚本语言创建Windows平台上的安装程序。NSIS提供了丰富的功能,包括文件复制、注册表...

    NSIS安装程序制作工具v3.09增强版.zip

    NSIS(Nullsoft Scriptable Install System)是一款强大的、开源的Windows平台下的安装程序制作工具。它的全称是“Nullsoft可脚本化安装系统”,它允许开发者通过编写脚本来创建功能丰富的安装、卸载程序,支持...

    nsis+nsisedit 项目安装程序打包

    "nsis+nsisedit 项目安装程序打包"是一个关于使用NSIS和NSISEdit工具进行软件打包的过程,包括Web项目的打包、MySQL数据库的升级和同步。通过这些工具和技术,开发者可以创建出具有专业水准且用户友好的安装和升级...

    nsis+winCodeSign+nsis-resources-3.4.1.zip

    NSIS (Nullsoft Scriptable Install System) 是一个流行的开源工具,用于生成Windows平台的安装程序。本文将深入探讨如何结合WinCodeSign和NSIS Resources,以解决命令行安装过程中可能遇到的错误,并创建专业且安全...

    NSIS工具--程序打包工具

    NSIS(Nullsoft Scriptable Install System)是一款强大的、开源的Windows平台下的安装制作系统,它允许用户使用简单的脚本语言创建具有专业外观的安装、卸载程序。NSIS工具因其灵活性、可定制性和免费性质而受到...

    duilib+nsis打包源码

    Duilib和NSIS是两种在软件开发中广泛使用的工具,主要应用于Windows平台的用户界面设计和安装包制作。本文将详细介绍这两个技术以及如何将它们结合使用来打包源码。 Duilib是一个开源的Windows用户界面库,它以C++...

    NSIS安装程序制作程序

    NSIS(Nullsoft Scriptable Install System)是一款强大的安装程序制作工具,特别适合Windows平台上的软件部署。这款开源软件提供了一套灵活的脚本语言,使开发者能够创建具有安装、卸载、系统配置以及文件解压缩等...

    NSIS(Nullsoft 脚本安装系统)安装程序

    它本来是一个由 Nullsoft 创建并用于作为 Winamp 及其插件发布的系统,但现已被上百个应用程序所应用,作为它们进行程序发布的工具。 NSIS 创建的安装程序可以进行安装、卸载、设置系统设置、解压文件等等。几乎...

    nsis+winCodeSign+nsis-resources.zip

    总的来说,这个压缩包提供了一整套的解决方案,涵盖了从安装程序的编写、编译到签名的全过程,对于那些希望快速、高效地创建专业级Windows安装程序的开发者来说,无疑是一个极其宝贵和实用的工具集合。

    用NSIS制作安装程序安装驱动.rar

    标题中的“用NSIS制作安装程序安装驱动”指的是使用Nullsoft Scriptable Install System(NSIS)这个开源的Windows系统下的安装脚本制作工具,来创建一个能够自动安装硬件驱动的安装程序。NSIS是一个功能强大的...

    NSIS安裝程序製作工具

    NSIS(Nullsoft Scriptable Install System)是一款强大的安装程序制作工具,它允许用户使用脚本语言来创建Windows下的安装、卸载程序。NSIS的灵活性和可定制性使其在开发者和系统管理员中广受欢迎,因为它可以轻松...

    nsis+nsis-resource+winCodesign+wine.zip

    【NSIS(Nullsoft Scriptable ...综上所述,这个压缩包集合了NSIS安装制作工具、WinCodeSign数字签名工具、NSIS资源库以及Wine环境,为开发者在Windows之外的平台上创建、签名和测试安装程序提供了全面的解决方案。

    NSIS 安装程序 可以实现组件选择安装

    NSIS 安装程序 可以实现组件选择安装 可以排斥选择 这个安装程序是用向导生成 然后往里面添加的代码

    安装程序制作工具NSIS套件.zip

    NSIS(Nullsoft Scriptable Install System)是一款强大的、开源的安装程序制作工具,它允许开发者创建功能丰富的Windows安装包,支持自定义脚本语言,提供丰富的功能和灵活度。NSIS套件通常包括一系列用于创建、...

    安装程序打包NSIS.zip

    NSIS(Nullsoft Scriptable Install System)是一款流行的开源安装制作系统,主要用于创建Windows平台上的安装、卸载程序。它的灵活性和可扩展性使得开发者能够定制符合特定需求的安装过程,支持多语言,提供了丰富...

    NSIS程序打包工具

    总的来说,NSIS程序打包工具是一个强大的解决方案,它使得开发者能够轻松地将应用程序及其依赖项打包成易于分发的安装程序,适用于各种Windows平台。通过熟练掌握NSIS,你可以创建出专业、定制化的安装体验,提高...

    用NSIS制作安装程序安装驱动

    在脚本的-Post部分增加安装驱动的命令,如下红色部分(注:在NSIS脚本中在双引号中输入引号的方法是$\",和C语言不同),installdriver后的第一个参数是inf文件的全路径,第二个参数是DeviceID(可以在设备管理器中...

    NSIS打包工具使用,制作安装包

    NSIS(Nullsoft Scriptable Install System)是一款开源的Windows系统下安装程序制作工具,它提供了安装、卸载、系统设置、文件解压缩等功能。NSIS的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序...

Global site tag (gtag.js) - Google Analytics