Python ctypes返回值问题

10
为什么如果我有这段简单的代码
void voidFunct() {
      printf("voidFunct called!!!\n");
}

我使用以下方式将其编译为动态库:

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

我使用ctypes从Python解释器中调用函数。

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

为什么从一个 void 方法返回的值是 17 而不是 None 或类似的值?谢谢。


4
嗯,我很肯定你不能在Python中写return = dll.voidFunct()。return是一个保留字。 - Boaz Yaniv
2个回答

36

根据文档:

class ctypes.CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False)

该类的实例代表已加载的共享库。这些库中的函数使用标准的C调用约定,并且假定返回int

简而言之,您将voidFunct()定义为返回int的函数,而不是void,并且Python希望它返回一个int(无论如何它都会得到一个值,只是一个随机值)。

您应该明确声明返回值类型为None

dll.voidFunct.restype = None

restype设置为您所述的内容会导致该函数返回None - David Heffernan
4
有趣的是,在官方文档的相关部分中仍未提及此事。 - Trilarion
@Trilarion 在“16.16.2.3节中的restype条目”中,它有所提及:“对于void和不返回任何东西的函数,请使用None”。然而,我真的希望在16.16.1.4节的表格中看到它列出来。 - saforrest

7
那是未定义的行为。您要求ctypes读取一个根本不存在的返回值。它从堆栈中读取了一些东西,但返回的内容是不明确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接