Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C++调用Python实例

本文以实例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:def pr(args):for arg in args:print arg

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 commandvoid exe_py( const std::string module_name, const std::string func_name, const std::vector<std::string>& args);

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 2048void 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] = ""; //buf_resfprintf(stderr, "------------ EXE RESULT: %s ------------ ", 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 " + "sys.path.append("pyfiles") " +"import " + module_name + " " +"ret = " + module_name + "." + func_name + "([" + args_str + "])""; LOG(INFO) << "exec command: "<< cmd;char* res = exe_command(cmd.c_str()); }

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 loginit_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);注意其中的Makefile文件:
  1. 需要include python.h 所在目录,即python的include目录
  2. C++编译参数加入-std=c++11:
    CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’)
  3. include glog所在目录

最后看一下本文中程序的结构:

 执行结果:
CentOS上源码安装Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htmPython脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm在Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htmPython 语言的发展简史 http://www.linuxidc.com/Linux/2014-09/107206.htmPython 的详细介绍:请点这里
Python 的下载地址:请点这里本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-06/132431.htm