C++调用python(C++)

#include	<string.h>
#include	<math.h>
#include	"iostream"
#include	"string"
#include    "fstream"
#include	<stdio.h>
#include	<stdlib.h>
#include	<sys/time.h>
#include	<unistd.h>
#include	"/usr/include/python2.6/Python.h"
using namespace std;

#define DEBUG_COUT 1

string str_tmp[5000][5000];
int list_len = 0;
int val_num = 0;

int get_py_list(string py_file,string py_path)
{
	string sys_path = "sys.path.append('"+py_path+"')";//系统搜索路径添加目标代码路径
	
	Py_Initialize();//python编译器初始化,无返回值来判断是否初始化成功。需要配合Py_IsInitialized来确认
	
	if(!Py_IsInitialized())
	{
		cout<<"初始化python解释器失败,请确认python解析器是否正常安装!!!"<<endl;
		return 0;
	}

	PyRun_SimpleString("import sys");//调用python语句,实际上是一个宏,执行一段Python代码。
	PyRun_SimpleString(sys_path.c_str());//添加python可执行路径
	
	//PyObject* modulename = Py_BuildValue("s", "py_file.c_str()"); //将C++类型转换为python类型。s表示python字符串
	//PyObject* module = PyImport_Import(modulename); //返回值为NULL表示调用失败。这两行等同于下面这句
	PyObject* get_envs_module = PyImport_ImportModule(py_file.c_str());//导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。
	
	PyObject* get_envs_func = PyObject_GetAttrString(get_envs_module, "readFileFunc");//返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句o.attr_name
	
	PyObject* args = Py_BuildValue("(iiss)", 5, 0,"1219.txt", "Outagesked::天津");
	PyObject* func_ret_val = PyObject_CallObject(get_envs_func, NULL); //此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得。
	//第二个参数pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。

	PyObject *list_item = NULL; //python类型的列表元素

	list_len = PyList_Size(func_ret_val); //获取列表长度
	#ifdef DEBUG_COUT
		cout<<"list_len is "<<list_len<<endl;
	#endif
	
	for (int i = 0; i < list_len; i++)
	{
		PyObject *list_item = PyList_GetItem(func_ret_val, i);//根据下标i取出python列表中的元素

		val_num = PyList_Size(list_item); //List对象子元素的大小,这里NumOfItems = 3
		#ifdef DEBUG_COUT
			cout<<" val_num is "<<val_num<<endl;
		#endif

		for(int Index_k = 0; Index_k < val_num; Index_k++)
		{
			PyObject *list_item_sub = PyList_GetItem(list_item, Index_k);//遍历List对象中子元素中的每个元素
			str_tmp[i][Index_k] = PyString_AsString(list_item_sub);//转换为c类型的数据
			//cout<<str_tmp[i][Index_k]<<endl;
			Py_DECREF(list_item_sub); //释放空间
		}
		Py_DECREF(list_item); //释放python创建对象的引用计数。否则容易引起内存泄漏
		if(i == list_len-1)
		{
			Py_Finalize(); //用于关闭Python解释器,释放解释器所占用的资源
			return 0;
		}
	}
	Py_Finalize(); //用于关闭Python解释器,释放解释器所占用的资源
	return 0;
}

int main(int argc,char **argv)
{
	string py_file = "readFile";
	string py_path = "/root/cpp_make/py_dir";

	get_py_list(py_file,py_path);
	
	#ifdef DEBUG_COUT
		cout<<"list_len is "<<list_len<<" val_num is "<<val_num<<endl;
	#endif
	
	for(int i=0;i<list_len;i++)
	{
		for(int j=0;j<val_num;j++)
		{
			cout<<str_tmp[i][j]<<" ";
		}
			cout<<endl;
	}

	return 0;
}
x
100
1
#include    <string.h>
2
#include    <math.h>
3
#include    "iostream"
4
#include    "string"
5
#include    "fstream"
6
#include    <stdio.h>
7
#include    <stdlib.h>
8
#include    <sys/time.h>
9
#include    <unistd.h>
10
#include    "/usr/include/python2.6/Python.h"
11
using namespace std;
12
13
#define DEBUG_COUT 1
14
15
string str_tmp[5000][5000];
16
int list_len = 0;
17
int val_num = 0;
18
19
int get_py_list(string py_file,string py_path)
20
{
21
    string sys_path = "sys.path.append('"+py_path+"')";//系统搜索路径添加目标代码路径
22
    
23
    Py_Initialize();//python编译器初始化,无返回值来判断是否初始化成功。需要配合Py_IsInitialized来确认
24
    
25
    if(!Py_IsInitialized())
26
    {
27
        cout<<"初始化python解释器失败,请确认python解析器是否正常安装!!!"<<endl;
28
        return 0
29
    }
30
31
    PyRun_SimpleString("import sys");//调用python语句,实际上是一个宏,执行一段Python代码。
32
    PyRun_SimpleString(sys_path.c_str());//添加python可执行路径
33
    
34
    //PyObject* modulename = Py_BuildValue("s", "py_file.c_str()"); //将C++类型转换为python类型。s表示python字符串
35
    //PyObject* module = PyImport_Import(modulename); //返回值为NULL表示调用失败。这两行等同于下面这句
36
    PyObject* get_envs_module = PyImport_ImportModule(py_file.c_str());//导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。
37
    
38
    PyObject* get_envs_func = PyObject_GetAttrString(get_envs_module, "readFileFunc");//返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句o.attr_name
39
    
40
    PyObject* args = Py_BuildValue("(iiss)", 5, 0,"1219.txt", "Outagesked::天津");
41
    PyObject* func_ret_val = PyObject_CallObject(get_envs_func, NULL); //此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得。
42
    //第二个参数pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。
43
44
    PyObject *list_item = NULL; //python类型的列表元素
45
46
    list_len = PyList_Size(func_ret_val); //获取列表长度
47
    #ifdef DEBUG_COUT
48
        cout<<"list_len is "<<list_len<<endl;
49
    #endif
50
    
51
    for (int i = 0; i < list_len; i++)
52
    {
53
        PyObject *list_item = PyList_GetItem(func_ret_val, i);//根据下标i取出python列表中的元素
54
55
        val_num = PyList_Size(list_item); //List对象子元素的大小,这里NumOfItems = 3
56
        #ifdef DEBUG_COUT
57
            cout<<" val_num is "<<val_num<<endl;
58
        #endif
59
60
        for(int Index_k = 0; Index_k < val_num; Index_k++)
61
        {
62
            PyObject *list_item_sub = PyList_GetItem(list_item, Index_k);//遍历List对象中子元素中的每个元素
63
            str_tmp[i][Index_k] = PyString_AsString(list_item_sub);//转换为c类型的数据
64
            //cout<<str_tmp[i][Index_k]<<endl;
65
            Py_DECREF(list_item_sub); //释放空间
66
        }
67
        Py_DECREF(list_item); //释放python创建对象的引用计数。否则容易引起内存泄漏
68
        if(i == list_len-1)
69
        {
70
            Py_Finalize(); //用于关闭Python解释器,释放解释器所占用的资源
71
            return 0;
72
        }
73
    }
74
    Py_Finalize(); //用于关闭Python解释器,释放解释器所占用的资源
75
    return 0;
76
}
77
78
int main(int argc,char **argv)
79
{
80
    string py_file = "readFile";
81
    string py_path = "/root/cpp_make/py_dir";
82
83
    get_py_list(py_file,py_path);
84
    
85
    #ifdef DEBUG_COUT
86
        cout<<"list_len is "<<list_len<<" val_num is "<<val_num<<endl;
87
    #endif
88
    
89
    for(int i=0;i<list_len;i++)
90
    {
91
        for(int j=0;j<val_num;j++)
92
        {
93
            cout<<str_tmp[i][j]<<" ";
94
        }
95
            cout<<endl;
96
    }
97
98
    return 0;
99
}
100




猜你喜欢

转载自www.cnblogs.com/linux-wang/p/9001418.html