我正在尝试了解 python 中的 ctypes,并且能够完成一些简单的工作,但是当涉及到解压 c 结构时,我发现自己遇到了一些困难。我决定要学习这个,我应该尝试一下,虽然我知道套接字标准库实现了gethostbyname_ex(),但我想我应该尝试使用ctypes和 来实现它libc.gethostbyname()。
我能够libc.gethostbyname()相当轻松地执行:
#!/usr/bin/env python
from ctypes import *
cdll.LoadLibrary('libc.so.6')
libc = CDLL('libc.so.6')
he = libc.gethostbyname("www.google.com")
Run Code Online (Sandbox Code Playgroud)
但这给了我一个hostent数据结构。我认为解压这个的最好方法是获取 c 结构并创建一个继承自 的类ctypes.Structure,所以我想出了这个(我hostent在 中找到了结构定义netdb.h):
class hostent(Structure):
'''
struct hostent
{
char *h_name; /* Official name of host. */
char **h_aliases; /* Alias list. */
int h_addrtype; /* Host address type. */
int h_length; /* Length of address. */
char **h_addr_list; /* List …Run Code Online (Sandbox Code Playgroud) 我在postgresql中有两个表,一个名为ip_address,另一个名为network.
该ip_address表有两列:
id 是一个 INTEGERv4address 是一个 INET该network表有两列:
id 是一个 INTEGERv4representation 是一个 CIDR我希望能够选择ip_address并急切加载ip_addresses network(s),而无需id在表之间定义基于外键的关系.这些id列由与其他表无关的其他关系使用.
完成此任务的SQL是:
select * from ip_address join network on ip_address.v4address << network.v4representation;
Run Code Online (Sandbox Code Playgroud)
在postgresql中,<<运算符可用于比较a INET和a CIDR.它将匹配INET包含在其中的行CIDR.
我可以property在我的IPAddress模型上定义一个可以完成此任务的模型:
@property
def networks(self):
query = session.query(Network)
query = query.filter("v4representation >> :v4addr").params(v4addr=self.v4address)
return query.all()
Run Code Online (Sandbox Code Playgroud)
这有效,但是当我真正尝试property在应用程序中使用它时,我遇到了典型的"N + 1"查询问题.我想以这样的方式定义它,以便能够急于加载IP地址网络.
我试图将其定义为relationship …