Python ctypes возвращаемых значений вопрос - PullRequest
4 голосов
/ 20 мая 2011

Почему, если у меня есть этот простой код

void voidFunct() {
      printf("voidFunct called!!!\n");
}

, я компилирую его как динамическую библиотеку с

gcc -c LSB.c -o LSB.o 
gcc -shared -Wl -o libLSB.so.1 LSB.o 

И я вызываю функцию из интерпретатора python, используя ctypes

>>> from ctypes import *
>>> dll = CDLL("./libLSB.so.1")
>>> return = dll.voidFunct()
voidFunct called!!!
>>> print return
17

почему значение, возвращаемое методом void, равно 17, а не None или подобному?Спасибо.

Ответы [ 2 ]

16 голосов
/ 20 мая 2011

Из документов:

класс ctypes.CDLL (имя, режим = DEFAULT_MODE, дескриптор = нет, use_errno = False, use_last_error = False)

Экземпляры этого класса представляют загруженные разделяемые библиотеки. Функции в этих библиотеках используют стандартное соглашение о вызовах C, и предполагается, что возвращает int .

Короче говоря, вы определили voidFunct () как функцию, возвращающую int, а не void, и Python ожидает, что он вернет int (который он получает, так или иначе, в любом случае - это просто случайное значение) .

Что вам, вероятно, следует сделать, это явно указать тип возвращаемого значения None.

dll.voidFunct.restype = None
5 голосов
/ 20 мая 2011

Это неопределенное поведение.Вы просите ctypes прочитать возвращаемое значение, которого просто нет.Он читает что-то из стека, но то, что возвращается, плохо определено.

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