#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
2
3
4
5
6
7
8
9
10
11
using namespace std;
12
13
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
48
cout<<"list_len is "<<list_len<<endl;
49
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
57
cout<<" val_num is "<<val_num<<endl;
58
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
86
cout<<"list_len is "<<list_len<<" val_num is "<<val_num<<endl;
87
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