我正在使用python ctypes模块访问一个包含一些time_t
字段的C结构。
由于它的非完全可移植性,我不能静态地将这些字段定义为c_int
或c_long
类型。
如何定义它们以使代码可移植?
示例C结构定义:
#import <sys/types.h>
#import <time.h>
typedef struct my_struct {
time_t timestap;
uint16_t code;
};
相应的python ctypes结构:
from ctypes import *
c_time = ? # What do I have to put here?
class MyStruct(Structure):
_fields_ = [
('timestamp', c_time),
('code', c_int16),
]
2条答案
按热度按时间8yoxcaq71#
最好的办法是通过内省脚本运行的系统,并对使用哪种整型进行最佳选择。
底线是
time_t
没有在标准中定义。这取决于操作系统和编译器。所以你在Python脚本中对time_t
的定义取决于你正在与之交互的DLL/。0g0grzrc2#
从Python 3.12开始(撰写本文时仍在开发中,计划于2023年10月发布),
ctypes.c_time_t
可以用于此,在您的示例中:我有一个last year的用例,the patch被接受了。
如果你还没有Python 3.12,像这样的东西可以做到这一点,尽管它没有涵盖所有情况(从上面的PR/issue):
这对于Windows(MSVC〉= 2005),macOS(x86_64,aarch 64)和Linux(arm 32,aarch 64,x86,x86_64)应该没问题,但可能需要在某些CPU上调整BSD。
一旦Python 3.12发布并且
ctypes.c_time_t
是一个东西,你就可以使用它了。例如,这是gPodder的
libgpod_ctypes.py
如何尝试使用ctypes.c_time_t
,但在旧系统上福尔斯了一些简单的启发式方法: