C++调用python
2016-04-05 12:31
483 查看
本文以实例code讲解 C++ 调用 python 的方法。
本文在util.h中实现三个函数:
1. init_log: 用google log(glog)初始化log
2. exe_command: 由 C++ 执行 shell code
3. exe_py: C++调用python文件
Code:
Python:
1
2
3
C++:
include/util.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
src/util.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
main.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
注意其中的Makefile文件:
需要include python.h 所在目录,即python的include目录
C++编译参数加入-std=c++11:
CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’)
include glog所在目录
最后看一下本文中程序的结构:
![](http://img.blog.csdn.net/20151024023438957)
执行结果:
![](http://img.blog.csdn.net/20151024025407288)
from: http://blog.csdn.net/abcjennifer/article/details/49377123
本文在util.h中实现三个函数:
1. init_log: 用google log(glog)初始化log
2. exe_command: 由 C++ 执行 shell code
3. exe_py: C++调用python文件
Code:
Python:
def pr(args): for arg in args: print arg
1
2
3
C++:
include/util.h:
/*************************************************************************** *- * Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved *- **************************************************************************/ - - - /** * @file util.h * @author zhangruiqing01(zhangruiqing01@baidu.com) * @date 2015/10/24 02:17:56 * @version $Revision$- * @brief- * i **/ #ifndef __UTIL_H_ #define __UTIL_H_ #include "glog/logging.h" #include <string> #include <vector> #define PYTHON_LIB_PATH "~/.jumbo/lib/python2.7" #define PYTHON_BIN_PATH "~/.jumbo/bin/python2.7" // initial log void init_log(const char* argv); // exe shell command char* exe_command(const char* cmd); // exe python command void exe_py( const std::string module_name, const std::string func_name, const std::vector<std::string>& args);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
src/util.cpp:
/*************************************************************************** *- * Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved *- **************************************************************************/ - - - /** * @file src/util.cpp * @author zhangruiqing01(zhangruiqing01@baidu.com) * @date 2015/10/24 02:12:34 * @version $Revision$- * @brief- *-- **/ #include "util.h" #include <stdio.h> #include <errno.h> #include <Python.h> #define MAX_LENGTH 2048 void init_log(const char* argv){ if (!getenv("GLOG_logtostderr")) { google::LogToStderr(); } google::InstallFailureSignalHandler(); google::InitGoogleLogging(argv); LOG(INFO) << "Create Log successfully"; } char* exe_command(const char* cmd){ FILE* fres; if ((fres = popen(cmd, "r")) != NULL){ char* buf_res = (char*) malloc(MAX_LENGTH); fread(buf_res, MAX_LENGTH, 1, fres); buf_res[strlen(buf_res) - 3] = '\0'; //buf_res fprintf(stderr, "------------\nEXE RESULT: %s\n------------\n", buf_res); pclose(fres); return buf_res; } else{ LOG(FATAL) << "Failed to execute '" << cmd << "'"; } } void exe_py( const std::string module_name, const std::string func_name, const std::vector<std::string>& args){ std::string args_str = ""; for(auto& arg : args){ args_str += arg + ","; } std::string cmd = "LD_LIBRARY_PATH=" + std::string(PYTHON_LIB_PATH) + ":" + "$LD_LIBRARY_PATH " + std::string(PYTHON_BIN_PATH) + " -c 'import sys\n" + "sys.path.append(\"pyfiles\")\n" + "import " + module_name + "\n" + "ret = " + module_name + "." + func_name + "([" + args_str + "])'"; LOG(INFO) << "exec command: "<< cmd; char* res = exe_command(cmd.c_str()); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
main.cpp:
/*************************************************************************** *- * Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved *- **************************************************************************/ - - - /** * @file src/util.cpp * @author zhangruiqing01(zhangruiqing01@baidu.com) * @date 2015/10/23 10:41:23 * @version $Revision$- * @brief- *-- **/ #include <stdio.h> #include <vector> #include <string> #include <util.h> #include <iostream> int main(int argc, char* argv[]){ //initial log init_log(argv[0]); char cmd[100]="echo 'abc'"; char* res = exe_command(cmd); std::string arg_v[] = {"1"}; std::vector<std::string>py_args(arg_v, arg_v + sizeof(arg_v)/sizeof(arg_v[0])); exe_py("printargs", "pr", py_args);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
注意其中的Makefile文件:
需要include python.h 所在目录,即python的include目录
C++编译参数加入-std=c++11:
CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’)
include glog所在目录
最后看一下本文中程序的结构:
执行结果:
from: http://blog.csdn.net/abcjennifer/article/details/49377123
相关文章推荐
- 修炼成C++高手必看的C++书单
- 外观模式(Facade)C++实现
- 寻找子树
- 蓝桥杯b组c++.4(等)
- C++统计输入字符串各个大写字母的个数
- 蓝桥杯b组c++.3
- C++指针知识点整理
- C语言第十二篇:迭代
- C++静态成员
- 《深度探索C++对象模型》笔记(一)
- 用C语言完成简单的计算器功能(1)
- C++ 四种类型转换
- sublime text2 C++编译环境配置
- c++ string 扩展函数
- C++中二维数组的参数传递
- [C/C++]_[初级]_[原子操作1]
- [C/C++]_[初级]_[原子操作]
- C++命名空间
- 使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
- C++基类和派生类的赋值