使用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){

我想从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){
    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文件夹中,它仍然这么说