社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Hosep • 4 年前 • 263 次点击  

如何将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
 
263 次点击  
文章 [ 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()))