Python中的off\t的适当映射的可移植性确定是否可以用于ctypes?

Python中的off\t的适当映射的可移植性确定是否可以用于ctypes?,python,posix,ctypes,Python,Posix,Ctypes,背景:off\t数据类型是的有符号整数。对于64位构建环境,它似乎始终是64位关闭。对于32位系统,off_t的大小取决于环境(通常由_FILE_OFFSET_位和相关位控制) 我使用Python访问一些使用off\t数据类型的函数的库调用ctypes没有用于off\u t的类型,因此通过或以其他方式映射此类API需要选择由ctypes定义的一些其他类型,即cUint、cUint32、cUint64、cUlong和cUlonglong中的一种 在搜索其他人的解决方案时,我看到了各种各样的解决方案

背景:
off\t
数据类型是的有符号整数。对于64位构建环境,它似乎始终是64位关闭。对于32位系统,off_t的大小取决于环境(通常由_FILE_OFFSET_位和相关位控制)

我使用Python访问一些使用
off\t
数据类型的函数的库调用ctypes没有用于
off\u t
的类型,因此通过或以其他方式映射此类API需要选择由ctypes定义的一些其他类型,即
cUint
cUint32
cUint64
cUlong
cUlonglong
中的一种

在搜索其他人的解决方案时,我看到了各种各样的解决方案,其中大多数都是猜测,并且仅限于其中一种环境,其中一些完全错误(使用无符号类型),而且没有一种是可移植的

对于给定Python解释器的构建,是否有一种健壮、可移植的方法来确定
off\t
的大小?


谢谢

标准中不支持这一点,正如您自己所指出的,在32位机器上,它将根据用于编译库的标志(而不是Python)而有所不同。(也就是说,您需要知道您正在使用的库例程是否使用-D_FILE_OFFSET_BITS=64进行编译…)

GCC似乎一致地将
off\u t
定义为
long int
。所以这可能是最“安全”的选择。或者您可以默认使用64位。在任何一种情况下,重写行为并指定位数的选项都可能是有价值的


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

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


是的,重要的是图书馆的建设。由于我想使用的库已经用Python进行了接口,并且可能是在一个匹配的环境中构建的,所以我希望这样的信息能够更容易访问并且足够。抱歉,我遗漏了这一点。不幸的是,没有函数或定义报告库的关闭大小。对Python中常见的库(tiff、zlib、HDF5)的调查表明,它们有办法做到这一点。现在我知道为什么了。我将继续将其添加到有问题的库中,作为将来的修复。感谢您考虑了一个潜在的解决方法,事实上,有一个函数返回\u t,这是一个混乱的问题,但也许它可以按照您的建议使用。
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