本文為大家介紹了python腳本設置系統時間的方法,一共有兩種,其一是調用socket直接發送udp包到國家授時中心,其二是調用ntplib包。我在本地電腦ping 國家授時中心地址cn.pool.ntp.org有時出現丟包,然而,二者都沒有檢查udp是否丟包的機制,方法一在udp丟包后一直處于阻塞狀態無法退出,方法二雖然會提示超時,但是不再做其它嘗試,比如重新發包,或者向同一個域名的不同IP地址發包。于是,嘗試在方法一的代碼基礎上,增加了超時機制,并且嘗試向同一個域名的不同IP地址發包。
具體修改后的完整代碼如下:
#-*- coding:utf-8 -*-import socketimport structimport timeimport win32apiimport osimport redef getTime(TimeServerAddresses): TIME_1970 = 2208988800L client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client.settimeout(3) data = '/x1b' + 47 * '/0' #TimeServer_ip=socket.gethostbyname('cn.pool.ntp.org') #TimeServer_ip='202.118.1.130' Port=123 for address in TimeServerAddresses: success=False count=0 while not success and count<3: print address,count try: client.sendto(data, (address, Port)) data, address = client.recvfrom(1024) success=True except socket.timeout: print 'Request timed out!' count=count+1 if success==True:a break data_result = struct.unpack('!12I', data)[10] data_result -= TIME_1970 return data_resultdef setSystemTime(now_time): tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst = time.gmtime(now_time) win32api.SetSystemTime(tm_year, tm_mon, tm_wday, tm_mday, tm_hour, tm_min, tm_sec, 0) print "Set System OK!"def getServerIP(): res1=os.popen('nslookup cn.pool.ntp.org') result1=res1.read() addresses=result1.split('/n/n')[1].split('/n')[1][12:].split(',') return addresses #for address in addresses: # res=os.popen('ping -n 2 '+address) # result=res.read() # received_num=int(re.findall('Received = [0-9]',result)[0].split('=')[1]) # if received_num > 1: # break #TimeServer=addressif __name__ == '__main__': addresses=getServerIP() now_time=getTime(addresses) setSystemTime(now_time) print "%d-%d-%d %d:%d:%d" % time.localtime(now_time)[:6]
以上就是本文的全部內容,希望對大家的學習有所幫助。