ctypes 并通过引用传递 a 到函数
我正在尝试使用 ctypes 在 python3 中使用 libpcap。
给定 python 中 C 中的以下函数
pcap_lookupnet(dev, &net, &mask, errbuf)
,我有以下内容
pcap_lookupnet = pcap.pcap_lookupnet
mask = ctypes.c_uint32
net = ctypes.c_int32
if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)
,我得到的错误是
File "./libpcap.py", line 63, in <module>
if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2
如何处理 &blah 值?
I'm trying to use libpcap in python3 using ctypes.
given the following function in C
pcap_lookupnet(dev, &net, &mask, errbuf)
in python I have the following
pcap_lookupnet = pcap.pcap_lookupnet
mask = ctypes.c_uint32
net = ctypes.c_int32
if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
print("Error could not get netmask for device {0}".format(errbuf))
sys.exit(0)
and the error i get is
File "./libpcap.py", line 63, in <module>
if(pcap_lookupnet(dev,net,mask,errbuf) == -1):
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2
how do you deal with &blah values ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您需要为
net
和mask
创建实例,并使用byref
来传递它们。You need to create instances for
net
andmask
, and usebyref
to pass them.ctypes.c_uint32
是一个类型。您需要一个实例:然后使用
ctypes.byref
传递:您可以使用
mask.value
检索值。ctypes.c_uint32
is a type. You need an instance:Then pass using
ctypes.byref
:You can retrieve the value using
mask.value
.您可能需要使用
ctypes.pointer
,如下所示:请参阅 指针 了解更多信息。
我假设您也为其他参数创建了 ctypes 代理。例如,如果 dev 需要一个字符串,则不能简单地传入 Python 字符串;您需要创建一个
ctypes_wchar_p
或类似的东西。You probably need to use
ctypes.pointer
, like this:See the ctypes tutorial section on pointers for more information.
I'm assuming you've created ctypes proxies for the other arguments as well. If
dev
requires a string, for example, you can't simply pass in a Python string; you need to create actypes_wchar_p
or something along those lines.