python源码学习(六)——用C++写一个python的简单模块

By | 2014/06/24

操作系统:Ubuntu 12.04 STL
python版本:2.7.5
首先,我们写一个C++的lib,稍微介绍一下传参:
传参其实在python中很简单的,首先我们来试试最间的传参,传整数,以下为C++代码:

#include <stdlib.h>
#include <iostream>
#include <string>
#include <string.h>

using namespace std;

int Add(int a,int b)
{
        return a+b;
}

extern "C"
{
	int add(int a,int b)
	{
		return Add(a,b);
	}
}

然后运行如下命令:

g++ -c -fPIC libx.cpp -o libx.o
g++ -shared -W1,-soname,libx.so -o libx.so libx.o

此时会生成一个libx.so的文件,我们把这个文件考入python文件同一级路径下,python代码如下:

#coding=utf-8
__author__ = 'karldoenitz'

from ctypes import cdll, c_char_p

lib_cpp = cdll.LoadLibrary('./libx.so')
print lib_cpp.add(3, 9)

此时我们运行python文件,会出现如下结果:12
好了,整数传参我们解决了,然后看一个复杂一点的,传递一个string,python向C++传递一个string要比C#向C++传递一个string要方便多了!代码如下:

#include <stdlib.h>
#include <iostream>
#include <string>
#include <string.h>

using namespace std;

int getNum(char *s)
{
	string language(s);
	string a="HelloWorld!";
	if(language==a)
	{
		return 1;
	}
	return 0;
}

int Add(int a,int b)
{
	return a+b;
}

extern "C"
{
	int get_Num(char *s)
	{
		return getNum(s);
	}
	int add(int a,int b)
	{
		return Add(a,b);
	}
}

然后依然运行刚才的那两行代码,将其编译为libx.so然后写python代码:

#coding=utf-8
__author__ = 'karldoenitz'

from ctypes import cdll, c_char_p

lib_cpp = cdll.LoadLibrary('./libx.so')
string_language = c_char_p("HelloWorld!")
print lib_cpp.get_Num(string_language)

运行python代码,有如下结果:1
接下来,我们看看python如何向C++传递一个string,同时收到一个string,C++的代码如下:

#include <stdlib.h>
#include <iostream>
#include <string>
#include <string.h>

using namespace std;

int getNum(char *s)
{
	string language(s);
	string a="HelloWorld!";
	if(language==a)
	{
		return 1;
	}
	return 0;
}

int Add(int a,int b)
{
	return a+b;
}

char* modifyString(char* recieveString)
{
	const char *addString = "OK,Sir!";
	strcat(recieveString,addString);
	return recieveString;
}

extern "C"
{
	int get_Num(char *s)
	{
		return getNum(s);
	}
	char* modify_String(char* recieveString)
	{
		return modifyString(recieveString);
	}
	int add(int a,int b)
	{
		return Add(a,b);
	}
}

然后写一个python代码:

#coding=utf-8
__author__ = 'karldoenitz'

from ctypes import cdll, c_char_p

lib_cpp = cdll.LoadLibrary('./libx.so')
string_language = c_char_p("HelloWorld!")
print lib_cpp.get_Num(string_language)
print lib_cpp.add(3, 9)
while True:
    string_from_console = raw_input("输入字符串:").strip()
    if string_from_console == "exit":
        break
    receive_string = lib_cpp.modify_String(string_from_console)
    print c_char_p(receive_string).value

好了,此时我们输入一个字符串,就会输出一个增加了OK,Sir!的新字符串,很简单的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.