Py学习  »  Python

python 3.6 ntp服务器查询功能转换

Hosep • 4 年前 • 259 次点击  

如何将python 2.7转换为python 3.6.5? 在这里,我试图查询一组NTP时间服务器,并确定哪个是异常值。

这可能是一些简单的改变,但我不确定。

from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import sys
import struct
import time

NTP_PACKET_FORMAT = "!12I"
NTP_DELTA = 2208988800L # 1970-01-01 00:00:00
NTP_QUERY = b'\x1b' + 47 * '\0'  

def ntp_time(host="pool.ntp.org", port=123):
    with closing(socket( AF_INET, SOCK_DGRAM)) as s:
        s.sendto(NTP_QUERY, (host, port))
        msg, address = s.recvfrom(1024)
    unpacked = struct.unpack(NTP_PACKET_FORMAT,
            msg[0:struct.calcsize(NTP_PACKET_FORMAT)])
    return unpacked[10] + float(unpacked[11]) / 2**32 - NTP_DELTA

if __name__ == "__main__":
    print time.ctime(ntp_time()).replace("  "," ")
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38602
 
259 次点击  
文章 [ 2 ]  |  最新文章 4 年前
U3.1415926
Reply   •   1 楼
U3.1415926    5 年前

这个 L 不存在于python3中,这是您需要更改的第一件事。转换 2208988800L 2208988800 read more here

第二,你应该重写你的 print A中的命令 print() 功能。 read more here

PM 2Ring
Reply   •   2 楼
PM 2Ring    5 年前

下面是您的代码的一个版本,它的更改最少,可以在python 3.6上正确运行。除了修复打印和长整型文字(我使用2to3自动修复),我还更改了 NTP_QUERY 到A bytes 字符串。

from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import sys
import struct
import time

NTP_PACKET_FORMAT = "!12I"
NTP_DELTA = 2208988800 # 1970-01-01 00:00:00
NTP_QUERY = b'\x1b' + bytes(47)

def ntp_time(host="pool.ntp.org", port=123):
    with closing(socket( AF_INET, SOCK_DGRAM)) as s:
        s.sendto(NTP_QUERY, (host, port))
        msg, address = s.recvfrom(1024)
    unpacked = struct.unpack(NTP_PACKET_FORMAT,
            msg[0:struct.calcsize(NTP_PACKET_FORMAT)])
    return unpacked[10] + unpacked[11] / 2**32 - NTP_DELTA

if __name__ == "__main__":
    print(time.ctime(ntp_time()).replace("  "," "))

可以做更多的事情来利用Python3的特性。这里有一个更流线型的版本。我们不需要 contextlib ,因为python 3套接字可以直接在 with 声明。我们不需要 struct ,作为python 3 int 有一个 from_bytes 方法。

from socket import socket, AF_INET, SOCK_DGRAM
import time

NTP_DELTA = 2208988800 # 1970-01-01 00:00:00
NTP_QUERY = b'\x1b' + bytes(47)

def ntp_time(host="pool.ntp.org", port=123):
    with socket( AF_INET, SOCK_DGRAM) as s:
        s.sendto(NTP_QUERY, (host, port))
        msg, _ = s.recvfrom(1024)
    return int.from_bytes(msg[-8:], 'big') / 2 ** 32 - NTP_DELTA

if __name__ == "__main__":
    print(time.ctime(ntp_time()))