При написании оболочки для Python для функции libmn getmntent linux существует странное различие между поведением между python 2.x и 3.x для следующего кода, где большая часть реальной работы выполняется библиотекой C. Поскольку я часто взаимодействую с кодом C на python, может кто-нибудь объяснить или исправить то, что идет не так?
import ctypes
import sys
class mntent(ctypes.Structure):
_fields_ = [("fsname", ctypes.c_char_p),
("dir", ctypes.c_char_p),
("type", ctypes.c_char_p),
("opts", ctypes.c_char_p),
("freq", ctypes.c_int),
("passno", ctypes.c_int)]
def main():
libc = ctypes.cdll.LoadLibrary('libc.so.6')
libc.getmntent.restype = ctypes.POINTER(mntent)
libc.fopen.restype = ctypes.POINTER(ctypes.c_void_p)
fp = libc.fopen('/etc/mtab', 'r')
while True:
mounts = libc.getmntent(fp)
if bool(mounts) == False:
libc.fclose(fp)
break
print("%30s %10s %s"%(mounts.contents.dir, mounts.contents.type, mounts.contents.fsname))
main()
Ожидаемый вывод содержит все перечисленные устройства монтирования с указанием их типов и точек монтирования. На python 3.x выдает пустой список.