如何使用ctypes从python访问预定义常量值?
我尝试使用ctypes获得一个值,例如SIGTERM(在我的环境x64 linux中,该值显然是15。)。 以下是我编写的代码,但是会引发ValueError(未定义符号)。 为什么会导致此错误?
请注意,我使用的是Ubuntu 19.10,x64,Python 3.7.5
代码:
from ctypes import *
from ctypes.util import *
libc_path = find_library("c")
libc = CDLL(libc_path)
sigterm_value = c_int.in_dll(libc, "SIGTERM")
答案 0 :(得分:2)
这是因为 SIGTERM ([man7]: SIGNAL(7))是宏(#define
:[GNU.GCC]: Object-like Macros)而不是常量。
因此,它不驻留在 libc 中(这意味着您不能通过 CTypes 来获取它),但是它只是一个别名(如果您愿意的话),在编译之前,它会被预处理器替换为( C )源代码中各处的值。
根据(官方)源文件([SourceWare]: [glibc.git]/bits/signum-generic.h):
#define SIGTERM 15 /* Termination request. */
在 Ubtu 16 64bit 中(我知道它已经很旧了,但是它是此时唯一运行的 Nix VM ),最终在 /usr/include/bits/signum.h 中定义:
#define SIGTERM 15 /* Termination (ANSI). */
您应该使用[Python 3.Docs]: signal - Set handlers for asynchronous events:
>>> import signal >>> signal.SIGTERM <Signals.SIGTERM: 15> >>> signal.SIGTERM.value 15