Поведение Ctypes Linux отличается на Py2 и Py3 - PullRequest
0 голосов
/ 07 мая 2019

При написании оболочки для 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 выдает пустой список.

1 Ответ

1 голос
/ 07 мая 2019

В Python 3 все строки в Unicode, но libc.fopen() хочет использовать простые байтовые строки в качестве аргументов:

fp = libc.fopen(b'/etc/mtab', b'r')
...