Python ctypes返回值问题

Emi*_*lio 5 python ctypes return-value dynamic-library

为什么我有这个简单的代码

void voidFunct() {
      printf("voidFunct called!!!\n");
}
Run Code Online (Sandbox Code Playgroud)

我将其编译为动态库

gcc -c LSB.c -o LSB.o 
gcc -shared -Wl -o libLSB.so.1 LSB.o 
Run Code Online (Sandbox Code Playgroud)

我使用ctypes从python解释器调用函数

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

为什么从void方法返回的值是17和不None相似?谢谢.

Boa*_*niv 19

来自文档:

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
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,在[官方文档的相关部分](https://docs.python.org/3.6/library/ctypes.html#return-types)中仍然没有提及。 (2认同)

Dav*_*nan 5

这是未定义的行为.你要求ctypes读取一个根本不存在的返回值.它从堆栈中读取内容,但返回的内容不明确.