可以在Python中为off_t的可移植确定适当的映射以便在ctypes中使用吗?

时间:2017-04-28 03:32:59

标签: python posix ctypes

背景:POSIX-defined off_t数据类型是variable-size depending on the environment的有符号整数。对于64位构建环境,它似乎始终是64位off_t。对于32位系统,off_t的大小取决于环境(通常由_FILE_OFFSET_BITS控制并相关)。

我正在使用Python ctypes访问一些使用off_t数据类型的函数的库调用。 ctypes 没有off_t的类型,因此通过Structure映射此类API或者需要选择 定义的其他类型< strong> ctypes ,即c_intc_int32c_int64c_longc_longlong之一。

在寻找其他人的解决方案时,我已经看到了各种各样的问题,其中大多数猜测并限于其中一种环境,其中一些是错误的(使用无符号类型),而且没有一种是可移植的。

是否有一种强大的,可移植的方法来确定用于构建给定Python解释器的off_t的大小?

谢谢!

2 个答案:

答案 0 :(得分:0)

在标准中没有对此的支持,正如您自己所指出的,基于用于编译库的标志,而不是Python,它将在32位计算机上有所不同。 (也就是说,您需要知道您使用的库例程是否使用-D_FILE_OFFSET_BITS = 64进行编译...)

GCC似乎将off_t定义为long int非常一致。这可能是最安全的&#34;选择。或者你可以默认使用64位。在任何一种情况下,覆盖行为和指定位数的选项都可能是有价值的。

是否有可以调用的函数将返回off_t?也许你可以用0xFF填充一个缓冲区,然后seek(0)ftell()来查看写入多少个零?

答案 1 :(得分:0)

我不是 100% 确定,但 sysconfig 可能就是这样(对于 python 3.2+):

Python 3.9.1 (default, Dec  8 2020, 02:26:20) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysconfig
>>> sysconfig.get_config_var('SIZEOF_OFF_T')
8
>>> sysconfig.get_config_var('SIZEOF_PID_T')
4