当前位置: 首页 > 面试题库 >

在ctypes中使用枚举

潘彦
2023-03-14
问题内容

我有一个通过ctypes访问的结构:

struct attrl {
   char   *name;
   char   *resource;
   char   *value;
   struct attrl *next;
   enum batch_op op;
};

到目前为止,我有类似以下的Python代码:

# struct attropl
class attropl(Structure):
    pass
attrl._fields_ = [
        ("next", POINTER(attropl)),
        ("name", c_char_p),
        ("resource", c_char_p),
        ("value", c_char_p),

但是我不确定该用什么batch_op枚举。我应该将其映射到ac_int还是?


问题答案:

至少对于GCCenum来说,只是一个简单的数字类型。它可以是8位,16位,32位,64位或其他任何值(我已经用64位值对其进行了测试)以及signedunsigned。我猜它不能超过long long int,但是实际上你应该检查你的范围enum并选择类似c_uint

这是一个例子。C程序:

enum batch_op {
    OP1 = 2,
    OP2 = 3,
    OP3 = -1,
};

struct attrl {
    char *name;
    struct attrl *next;
    enum batch_op op;
};

void f(struct attrl *x) {
    x->op = OP3;
}

和Python之一:

from ctypes import (Structure, c_char_p, c_uint, c_int,
    POINTER, CDLL)

class AttrList(Structure): pass
AttrList._fields_ = [
    ('name', c_char_p),
    ('next', POINTER(AttrList)),
    ('op', c_int),
]

(OP1, OP2, OP3) = (2, 3, -1)

enum = CDLL('./libenum.so')
enum.f.argtypes = [POINTER(AttrList)]
enum.f.restype = None

a = AttrList(name=None, next=None, op=OP2)
assert a.op == OP2
enum.f(a)
assert a.op == OP3


 类似资料:
  • 问题内容: 我正在使用ctypes在Python中加载DLL。这很好。 现在,我们希望能够在运行时重新加载该DLL。 直接的方法似乎是:1.卸载DLL 2.加载DLL 不幸的是,我不确定卸载DLL的正确方法是什么。 _ctypes.FreeLibrary可用,但私有。 还有其他卸载DLL的方法吗? 问题答案: 您应该能够通过放置对象来做到这一点 编辑: 霍普的评论是正确的,这取消了名称的绑定,但是

  • 问题内容: 我有一个电影租借系统的现有数据库。每部电影都有一个评级属性。在SQL中,他们使用约束来限制此属性的允许值。 我认为使用Java枚举将约束映射到对象世界会很好。但是由于“ PG-13”和“ NC-17”中的特殊字符,不可能简单地获取允许的值。因此,我实现了以下枚举: 使用toString()方法,方向enum-> String可以正常工作,但是String-> enum不能正常工作。我得

  • 问题内容: 我想使用IFileOperation从python代码复制文件- 它比python更快 您会看到一个不错的对话框 不阻止Python 在Windows 10上,Python 3.8- 似乎不存在。 如何使用来联系(不是不​​推荐使用的API)? 问题答案: 该问题使用comtypes.GUID作为唯一(非标准)依赖项。 看一下comtypes本身,它是纯python并使用ctypes(

  • 问题内容: 是否可以在Java枚举中使用,还是需要使用?在我的测试中,它始终有效,但是我不确定是否可以保证。特别是,在枚举上没有方法,因此我不知道是否有可能获得一个枚举,该枚举将返回不同于的值。 例如,这样可以吗: 还是我需要这样写: 问题答案: 仅需2美分:这是Sun发布的Enum.java的代码,并且是JDK的一部分:

  • ctypes 是 Python 的一个外部库,提供和 C 语言兼容的数据类型,可以很方便地调用 C DLL 中的函数。 ctypes 的使用非常简明,如调用 cdecl 方式的 DLL 只需这样: from ctypes import *;h=CDLL('msvcrt.dll')h.printf('a=%d,b=%d,a+b=%d',1,2,1+2);

  • 我经常挠头的情况下,让我们说我有一个通用的类在一个pod中,可以处理权限,在应用程序中,我希望能够扩展它来创建更有意义的方法名称,也就是使用枚举作为参数,使其使用更清晰,更不容易出错。 但在别处创建扩展时,似乎不能调用private方法。 我相信会有更干净的方法,或者我的模式是错误的... 以下是它的简化版本: 外部pod中的类: 以及应用程序中的扩展: 澄清: 是Pod中的一个类,仅用于检查在使