2015-05-21 40 views
1

我想知道從蟒蛇的NetworkInterfaces的名字,但現在看來,這所以我用這個C代碼是不可能的蟒蛇:用C在Python

#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"); 
} 

這是有益的?有什麼步驟將它與ctypes一起導入Python?我該怎麼做?還有一種方法可以返回元組列表而不是打印它嗎?我需要編譯它嗎?如果我做我該怎麼辦?

回答

0

這是好嗎?

差不多。除非你是signaling an exception,否則不要將0/null作爲PyObject*返回;而是增加Py_None並返回它。而且您可能還想添加實際的錯誤檢查代碼。

有什麼步驟用ctypes將它導入Python?我該怎麼做?

你寫的東西不需要ctypes,因爲它是用C編寫的實際Python模塊。在將代碼編譯爲interfaces.pyd後使用import interfaces

也有辦法返回元組列表而不是打印它嗎?我需要編譯它嗎?如果我做我該怎麼辦?

用正常的listtuple函數;創建對象並根據需要輪流設置每個元素。

+0

謝謝!使用什麼工具將.pc編譯爲.pyd? – ori

+0

一個C編譯器。 .pyd文件只是一個重命名的DLL。 –

+0

我試着運行'gcc interfaces.c',它說'Python.h:沒有這樣的文件或目錄' – ori