|
通过IP地址反查归属地的python模块
业务逻辑由其它C++模块已经完成了开发。
#include <Python.h>
#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/ |
|
|