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实现分页效果
Oct 25 Python
python实现媒体播放器功能
Feb 11 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
Python matplotlib的使用并自定义colormap的方法
Dec 13 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
Python模块汇总(常用第三方库)
Oct 07 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
Python列表元素删除和remove()方法详解
Jan 04 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
使PHP自定义函数返回多个值
2006/11/26 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
PHP里的单例类写法实例
2015/06/25 PHP
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
python实现人工蜂群算法
2020/09/18 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
linux比较文件内容的命令是什么
2015/09/23 面试题
大学优秀班集体申报材料
2014/05/23 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书