背景: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_int
,c_int32
,c_int64
,c_long
和c_longlong
之一。
在寻找其他人的解决方案时,我已经看到了各种各样的问题,其中大多数猜测并限于其中一种环境,其中一些是错误的(使用无符号类型),而且没有一种是可移植的。
是否有一种强大的,可移植的方法来确定用于构建给定Python解释器的off_t
的大小?
谢谢!
答案 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