Python 3.6转换NTP服务器查询功能



如何将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 * ''  
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 3.6 上正确运行。除了修复打印和我使用 2to3 自动完成的长整数文本外,我还NTP_QUERY更改为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("  "," "))

为了利用 Python 3 的功能,还可以做一些事情。这是一个更简化的版本。我们不需要contextlib,因为 Python 3 套接字可以直接在with语句中使用。而且我们不需要struct,因为Python 3int有一个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()))

python3 中不存在L,这是您需要更改的第一件事。 将2208988800L转换为2208988800在此处阅读更多内容

其次,您应该在print()函数中重写print命令。 在此处阅读更多内容

最新更新