Python语言编写电脑时间自动同步小工具


Posted in Python onMarch 08, 2013

话不多说,小工具需求如下:
功能需求 -- 电脑开机后自动执行时间同步
非功能需求 -- 安装执行简单,无需安装额外环境

一、代码实现

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

获取网络时间

 def getBeijinTime():
     """
  获取北京时间
     """
     try:
         conn = httplib.HTTPConnection("www.beijing-time.org")
         conn.request("GET", "/time.asp")
         response = conn.getresponse()
         print response.status, response.reason
         if response.status == 200:
             #解析响应的消息
             result = response.read()
             logging.debug(result)
             data = result.split("\r\n")
             year = data[1][len("nyear")+1 : len(data[1])-1]
             month = data[2][len("nmonth")+1 : len(data[2])-1]
             day = data[3][len("nday")+1 : len(data[3])-1]
             #wday = data[4][len("nwday")+1 : len(data[4])-1]
             hrs = data[5][len("nhrs")+1 : len(data[5])-1]
             minute = data[6][len("nmin")+1 : len(data[6])-1]
             sec = data[7][len("nsec")+1 : len(data[7])-1]
             beijinTimeStr = "%s/%s/%s %s:%s:%s" % (year, month, day, hrs, minute, sec)
             beijinTime = time.strptime(beijinTimeStr, "%Y/%m/%d %X")
             return beijinTime 
     except:
         logging.exception("getBeijinTime except")
         return None

同步本地系统时间
 def syncLocalTime():
     """
     同步本地时间
     """
     logging.info("current local time is: %d-%d-%d %d:%d:%d" % time.localtime()[:6])     beijinTime = getBeijinTime() 
     if beijinTime is None:
         logging.info("get beijinTime is None, will try again in 30 seconds...")
         timer = threading.Timer(30.0, syncLocalTime)
         timer.start();
     else:
         logging.info("get beijinTime is: %d-%d-%d %d:%d:%d" % beijinTime[:6])
         tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec = beijinTime[:6]
         import os
         os.system("date %d-%d-%d" % (tm_year, tm_mon, tm_mday))     #设置日期
         os.system("time %d:%d:%d.0" % (tm_hour, tm_min, tm_sec))    #设置时间
         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服务示例

 import win32serviceutil
 import win32service
 import win32event
 import win32evtlogutil class SynctimeService(win32serviceutil.ServiceFramework):
     _svc_name_ = "Synctime"
     _svc_display_name_ = "Synctime"
     _svc_description_ = "Synchronize local system time with beijin time"
    _svc_deps_ = ["EventLog"]
    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
    def SvcDoRun(self):
        import servicemanager
        # Write a 'started' event to the event log...
        win32evtlogutil.ReportEvent(self._svc_name_,
                                    servicemanager.PYS_SERVICE_STARTED,
                                    0, # category
                                    servicemanager.EVENTLOG_INFORMATION_TYPE,
                                    (self._svc_name_, ''))
        # wait for beeing stopped...
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
        # and write a 'stopped' event to the event log.
        win32evtlogutil.ReportEvent(self._svc_name_,
                                    servicemanager.PYS_SERVICE_STOPPED,
                                    0, # category
                                    servicemanager.EVENTLOG_INFORMATION_TYPE,
                                    (self._svc_name_, ''))   
if __name__ == '__main__':
    # Note that this code will not be run in the 'frozen' exe-file!!!
    win32serviceutil.HandleCommandLine(SynctimeService) 

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

Setup.py

 from distutils.core import setup
 import py2exe setup(
     # The first three parameters are not required, if at least a
     # 'version' is given, then a versioninfo resource is built from
     # them and added to the executables.
     version = "0.0.1",
     description = "Synchroniz local system time with beijin time",
     name = "sysctime",
     # targets to build
     # console = ["synctime.py"],
     service=["synctime"]
 )

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

Python语言编写电脑时间自动同步小工具

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

Python语言编写电脑时间自动同步小工具

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

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

现在可以运行services.msc查看服务运行情况Python语言编写电脑时间自动同步小工具

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

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

installservice.bat

 @echo off :: 安装windows服务
 echo 正在安装服务,请稍候...
 synctime.exe -install
 :: 设置服务自动启动
 echo 正在启动服务...
 sc config Synctime start= AUTO

:: 启动服务
sc start Synctime
echo 服务启动成功, 按任意键继续...
pause

removeserivce.bat

@echo off
:: 停止服务
echo 正在停止服务,请稍候...
sc stop Synctime
echo 正在卸载服务...
:: 删除windows服务
synctime.exe -remove
echo 服务卸载完成,请按任意键继续剩余卸载...
pause

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

三、最终安装效果图

Python语言编写电脑时间自动同步小工具

Python语言编写电脑时间自动同步小工具

四、结尾

遗留的问题:

1、从上面的截图可以看到,安装程序在调用批处理时会显示出控制台窗口。这个问题我在网上查找资料,NSIS有相关的插件可以隐藏控制台窗口调用bat文件。
2、我源代码中有写日志文件的操作,但是以Windows服务的方式运行后,日志文件不能写了,不知道有没有好的解决办法。
3、360 ...真是要人命啊....Orz..

时间同步工具及源代码:https://3water.com/softs/74865.html

编译方法:

第一步: 安装Python环境(什么?还没有Python环境?... - -!)
第二步: 安装依赖组件
1、py2exe (目前只支持到python2.7)
2、Python Win32 Extensions

第三步(可选):安装Nsis环境,用来编译脚本

第四步:将synctime.py编译成windows程序
1、在当前目录下运行"setup.py py2exe",顺利的话会在当前目录下生成dist和build目录

第五步: 运行,有两种运行方式:
1、将installservice.bat 和 removeservice.bat 拷贝到dist中运行即可
2(依赖第三步)、使用Nsis编译Synctime.nsi脚本,生成安装包, 安装后运行(推荐)

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
Python爬虫学习之翻译小程序
Jul 30 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
py2exe 编译ico图标的代码
Mar 08 #Python
python中wx将图标显示在右下角的脚本代码
Mar 08 #Python
python中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 #Python
python中关于日期时间处理的问答集锦
Mar 08 #Python
python局部赋值的规则
Mar 07 #Python
Python 用户登录验证的小例子
Mar 06 #Python
Eclipse + Python 的安装与配置流程
Mar 05 #Python
You might like
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
Thinkphp调用Image类生成缩略图的方法
2015/03/07 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python处理Excel文件实例代码
2017/06/20 Python
python实现excel读写数据
2021/03/02 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
internal修饰符起什么作用
2013/12/16 面试题
超市业务员岗位职责
2013/12/05 职场文书
经济管理自荐书
2014/06/09 职场文书
查摆剖析材料范文
2014/09/30 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏