我尝试从Python访问C&#39 {1}函数以避免gmtime()
,因为当我尝试转换大列时似乎耗费了大量时间时间戳长值。这就是我所拥有的:
datetime.datetime. fromtimestamp()
无论我输入什么号码,我都会得到from ctypes import *
libc = CDLL('msvcrt.dll')
gmtime = libc.gmtime
gmtime([any timestamp I try])
。
OSError:异常:访问冲突读取0x0098967F
我必须犯错误,但我无法弄明白。有人可以指出我的错误吗?
修改
将最后一行替换为:
17181872
没有解决问题 - 我得到gmtime(byref(c_int64([any timestamp I try])))
以回应我输入的任何数字。有什么想法吗?
答案 0 :(得分:2)
gmtime
的定义:
struct tm *gmtime(const time_t *clock);
所以你需要提供一个指针:
tm = ctype.c_int64(1505656543)
gmtime(ctypes.byref(tm))
gmtime
的返回类型是指向结构的指针:
class TimeStruct(ctypes.Structure):
_fields_ = [
("tm_sec", ctypes.c_int),
("tm_min", ctypes.c_int),
("tm_hour", ctypes.c_int),
("tm_mday", ctypes.c_int),
("tm_mon", ctypes.c_int),
("tm_year", ctypes.c_int),
("tm_wday", ctypes.c_int),
("tm_yday", ctypes.c_int),
("tm_isdst", ctypes.c_int),
]
gmtime.restype = ctypes.POINTER(TimeStruct)
time_data = gmtime(ctypes.byref(ctypes.c_int64(1505656543)))
print(time_data.contents.tm_hour)
但是没有必要自己做这一切。 time.gmtime
是C函数gmtime
周围非常薄的wapper。我怀疑你能比它更快地得到它。