如何使用ctypes从Python3访问C中的某些常量值

时间:2019-12-29 06:57:32

标签: python linux ctypes

如何使用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")

1 个答案:

答案 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