我有一个通过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位值对其进行了测试)以及signed
或unsigned
。我猜它不能超过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中的一个类,仅用于检查在使