python-3.x - Python3、ctypes API 和枚举
问题描述
即使 Enum 包含 classmethod ,我似乎也无法实例化具有 Enum 返回值的 ctypes.CFUNCTYPE 原型from_param
。有人经历过吗?有没有解决方法,也许?我做错什么了吗?
这有效:
import ctypes as ct
@ct.CFUNCTYPE(ct.c_int, ct.c_int)
def pyfunc(a):
return 100
print(pyfunc(10))
100
这也有效(linux):
import ctypes as ct
import enum
class MyEnum(enum.Enum):
A = 1
B = 2
@classmethod
def from_param(cls, param):
return ct.c_int(param)
printf = ct.CDLL("libc.so.6").printf
printf.restype = MyEnum
printf(b"1")
<我的枚举.A: 1>
printf(b"12")
<MyEnum.B: 2>
这失败了:
import ctypes as ct
import enum
class E(enum.Enum):
A = 10
@classmethod
def from_param(cls, param):
return ct.c_int(param)
@ct.CFUNCTYPE(E, ct.c_int)
def pyfunc(a):
return E(10)
Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> @ct.CFUNCTYPE(E, ct.c_int) TypeError: invalid result type for callback function
解决方案
这里有几个问题:
的返回值
pyfunc
返回到 C 例程,因此必须是标准 ctypes 类型(E
不是 ctype 类型)既不
from_param
也不_as_parameter_
似乎被要求返回类型
要解决这些问题,您必须
- 更改为
E
_@ct.CFUNCTYPE
ct.c_int
和以下之一:
- 使用
IntEnum
而不是Enum
或者
- 返回
E(a).value
或者
- 将
__int__
and添加__index__
到您的枚举中(这使得它int
足够像ctypes
):
class E(enum.Enum):
A = 10
#
def __int__(self):
return self.value
__index__ = __int__
推荐阅读
- git - 是否可以为开发分支重写非常古老的 git 历史
- java - Elasticsearch 地理查询
- python - 使用日期时间设置函数来循环字典的值
- swagger - swagger 文件 - 标记字段为必填项和可选项
- aws-lambda - 如何使用 API 网关中的阶段变量通过无服务器框架指向不同的 lambda 函数
- google-analytics - mci通信服务公司 d/b/a verizon 业务
- sqoop - 批量降压插入 Sybase IQ
- sqlite - 显示 SQLite 的 raise 函数的错误信息?
- linux - 回声:写入错误:为 NVMe SSD 设置 io_poll 时参数无效
- python - 如何使用 opencv python 将图像缓冲区转换为 CV_8UC3 数组?