国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python語(yǔ)言編寫電腦時(shí)間自動(dòng)同步小工具

2019-11-25 18:40:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

話不多說(shuō),小工具需求如下:
功能需求 -- 電腦開機(jī)后自動(dòng)執(zhí)行時(shí)間同步
非功能需求 -- 安裝執(zhí)行簡(jiǎn)單,無(wú)需安裝額外環(huán)境

一、代碼實(shí)現(xiàn)

基于以上需求,思路如下:訪問(wèn)網(wǎng)絡(luò)獲取北京時(shí)間,然后調(diào)用命令行來(lái)設(shè)置系統(tǒng)時(shí)間。程序?qū)懗蒞indows Service,并設(shè)置為開機(jī)自動(dòng)運(yùn)行。正好前段時(shí)間在學(xué)習(xí)Python,所以打算用Python來(lái)寫這個(gè)工具。具體代碼如下:

獲取網(wǎng)絡(luò)時(shí)間

復(fù)制代碼 代碼如下:

 def getBeijinTime():
     """
    獲取北京時(shí)間
     """
     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:
             #解析響應(yīng)的消息
             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

同步本地系統(tǒng)時(shí)間
復(fù)制代碼 代碼如下:

 def syncLocalTime():
     """
     同步本地時(shí)間
     """
     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))     #設(shè)置日期
         os.system("time %d:%d:%d.0" % (tm_hour, tm_min, tm_sec))    #設(shè)置時(shí)間
         logging.info("syncLocalTime complete, current local time: %d-%d-%d %d:%d:%d /n" % time.localtime()[:6])

二、部署安裝

為了讓Python程序能以Windows服務(wù)的方式運(yùn)行,需要用到py2exe(用來(lái)把Python程序編譯成exe)和Python Win32 Extensions 。(py2exe把Python代碼編譯成Winodws服務(wù)時(shí)依賴此組件)下載并安裝這兩個(gè)組件。安裝完畢后,在Python的安裝目錄下找到py2exe的Windows Service示例({PythonRoot}/Lib/site-packages/py2exe/samples/advanced/MyService.py)。然后仿照這個(gè)示例將上面的代碼完善一下。

Windows服務(wù)示例

復(fù)制代碼 代碼如下:

 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) 



之后,再編寫一個(gè)steup.py文件用來(lái)生成安裝文件。

Setup.py

復(fù)制代碼 代碼如下:

 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程序,如下圖:

然后在控制臺(tái)中運(yùn)行:setup.py py2exe ,一切順利的話會(huì)在當(dāng)前目錄下生成build和dist目錄。

控制臺(tái)目錄切換到dist目錄,找到synctime.exe,在命令行中運(yùn)行:

synctime.exe

主站蜘蛛池模板: 阿拉善右旗| 乌鲁木齐县| 哈密市| 黑龙江省| 伊金霍洛旗| 五莲县| 油尖旺区| 辛集市| 西安市| 麻阳| 水城县| 台北市| 中西区| 乳源| 上栗县| 德昌县| 中方县| 临武县| 罗山县| 泰州市| 北辰区| 洛南县| 阳泉市| 柳江县| 赞皇县| 鲁山县| 隆尧县| 日照市| 邛崃市| 琼结县| 江孜县| 岑溪市| 桐庐县| 宜阳县| 陈巴尔虎旗| 宾川县| 桓台县| 邵东县| 阿克苏市| 石首市| 湘阴县|