#include
#include "iplookup.h"
static il_db_t _g_db;
ipitem ip_lookup(const char *query)
{
const char *encoding = "UTF-8";
data_type type = text;
ipitem iphm;
il_iplookup(query, iphm, _g_db, type, encoding);
return iphm;
}
static PyObject * wrap_ip_lookup(PyObject *self, PyObject *args)
{
const char * command;
if (!PyArg_ParseTuple(args, "s", &command))//这句是把python的变量args转换成c的变量command
return NULL;
ipitem iphm = ip_lookup(command);//调用c的函数
return Py_BuildValue("(sssssss)",iphm.country ,iphm.province,iphm.city ,iphm.district,iphm.isp , iphm.type , iphm.desc);
//把c的返回值n转换成python的对象
}
// 3 方法列表
static PyMethodDef IpLocateMethods[] = {
{"ip_lookup", wrap_ip_lookup, METH_VARARGS, "locate ip address."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initiplocate(void)
{
PyObject *m = Py_InitModule("iplocate", IpLocateMethods);
const char* db_file = "/opt/iplookup/share/ip.db";
_g_db = il_open(db_file);
if (m == NULL) return;
}
编译安装:
g++ -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I. -I/opt
/python2.6/include/python2.6 -c iplocate.cpp -o iplocate.o
g++ -Xlinker -export-dynamic -pthread -shared -Wl,-O1 -Wl libiplookup_la-ip.o
libiplookup_la-iplookup.o libiplookup_la-iconv_ext.o iplocate.o -o iplocate.so
-I /opt/python2.6/include/python2.6 -I /usr/include/
把生成的模块移到:
/opt/python2.6/lib/python2.6/lib-dynload/
分享到:


2010-02-02 13:47
浏览 1883
评论
本文介绍了一个使用C语言编写的Python扩展模块iplocate,该模块通过调用iplookup库来实现IP地址的地理位置定位功能。文章提供了模块的源代码,并详细说明了编译和安装过程。
2342

被折叠的 条评论
为什么被折叠?



