使用Python中的C
我想从python中知道NetworkInterface的名称,但从python中似乎不可能,因此我使用以下C代码:使用Python中的C,python,c,ctypes,network-interface,Python,C,Ctypes,Network Interface,我想从python中知道NetworkInterface的名称,但从python中似乎不可能,因此我使用以下C代码: #include <Python.h> #include <windows.h> #include <iphlpapi.h> #include <stdio.h> #pragma comment(lib, "iphlpapi.lib") PyObject* GetInterfaces (PyObject* self){
#include <Python.h>
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
PyObject* GetInterfaces (PyObject* self){
ULONG buflen = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen);
if (GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen);
}
if (GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) {
for (IP_ADAPTER_INFO *pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) {
printf("%s (%s)\n", pAdapter->IpAddressList.IpAddress.String, pAdapter->Description);
}
}
if (pAdapterInfo) free(pAdapterInfo);
return 0;
}
static char interfaces_docs[] =
"GetInterfaces( ): prints the interfaces name and IP\n";
static PyMethodDef interfaces_funcs[] = {
{"GetInterfaces", (PyCFunction)GetInterfaces,
METH_NOARGS, interfaces_docs},
{NULL}
};
void initinterfaces(void)
{
Py_InitModule3("interfaces", interfaces_funcs,
"Interfaces Module");
}
#包括
#包括
#包括
#包括
#pragma注释(lib,“iphlapi.lib”)
PyObject*GetInterfaces(PyObject*self){
ULONG buflen=sizeof(IP适配器信息);
IP适配器信息*pAdapterInfo=(IP适配器信息*)malloc(buflen);
if(getAdapterInfo(pAdapterInfo,&buflen)=错误\缓冲区\溢出){
免费(pAdapterInfo);
pAdapterInfo=(IP_适配器_信息*)malloc(buflen);
}
if(getAdapterInfo(pAdapterInfo,&buflen)=无错误){
用于(IP_适配器_INFO*pAdapter=padapternfo;pAdapter;pAdapter=pAdapter->Next){
printf(“%s(%s)\n”,pAdapter->IpAddressList.IpAddress.String,pAdapter->Description);
}
}
如果(padapternfo)空闲(padapternfo);
返回0;
}
静态字符接口\u文档[]=
“GetInterfaces():打印接口名称和IP\n”;
静态PyMethodDef接口_funcs[]={
{“GetInterfaces”,(PyCFunction)GetInterfaces,
方法、接口、文档、,
{NULL}
};
void初始化接口(void)
{
Py_InitModule3(“接口”,接口函数,
“接口模块”);
}
这个好吗?用ctypes将其导入Python的步骤是什么?我怎么做?还有一种方法可以返回元组列表而不是打印它吗?我需要编译它吗?如果我这样做了,我怎么能
这个好吗
差不多。永远不要将0/null作为PyObject*
返回,除非;相反,递增Py_None
并返回它。您可能还需要添加实际的错误检查代码
用ctypes将其导入Python的步骤是什么?我怎么做
您所编写的不需要ctypes,因为它是用C编写的实际Python模块。将代码编译为interfaces.pyd后,使用import interfaces
还有一种方法可以返回元组列表而不是打印它吗?我需要编译它吗?如果我这样做了,我怎么能
具有正常的功能;创建对象并根据需要依次设置每个元素。谢谢!使用什么工具将.c编译成.pyd?c编译器。pyd文件只是一个重命名的DLL。我试着运行“gcc interfaces.c”,它说“Python.h:没有这样的文件或目录”。你需要告诉gcc在哪里可以找到Python.h。我试着将interfaces.c放在找到Python.h的include文件夹中,它仍然这么说