Получение ошибки после ошибки в завернутой функции c в Python - PullRequest
0 голосов
/ 20 сентября 2018

Я изучаю, как обернуть функции c, используя Python ctypes' and am able to wrap and call a function, but I can't figure out how to get the errno` после ошибки.Для этого примера я обертываю inotify_add_watch .Это не полный код, просто пример чего-то, что вызовет ошибку:

import ctypes

c_lib = ctypes.cdll.LoadLibrary('libc.so.6')

inotify_add = c_lib.inotify_add_watch
inotify_add.argtypes = (ctypes.c_int, ctypes.c_char_p, ctypes.c_uint32)
inotify_add.restype = ctypes.c_int

# This will cause an EBADF error
inotify_add(32, b'/tmp', 1)  # returns -1

И в документации, которую я привел, сказано, что это вернет -1, что он делает, но он также установитerrno соответственно.Я не могу понять, как получить доступ к errno сейчас.Если я попытаюсь ctypes.get_errno(), это просто вернет 0.Если я пытаюсь вызвать c_lib.errno(), это вызывает segmentation error, так что это тоже не работает.Есть ли способ, которым я могу получить errno?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы должны получить ошибку из той же библиотеки CRT, с которой был построен Python.Так что для Python 3.7 на Windows.У меня нет под рукой Linux, поэтому, надеюсь, это направит вас в правильном направлении.

>>> dll = CDLL('ucrtbase',use_errno=True)
>>> get_errno()
0
>>> dll._access(b'nonexisting',0)
-1
>>> get_errno()
2

Errno 2 - ENOENT (нет такого файла или каталога), поэтому он установлен и выглядит правильно.

Другая библиотека CRT имеет другой экземпляр errno, поэтому Python неправильно ее захватывает для использования с set_errno()/get_errno().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...