C++调用Python实例

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错
本文以实例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                                                             
#include                                                             

#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);                               

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                                                                
#include                                                                
#include                                                               
#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] = '';                                     
        //buf_res                                                                
        fprintf(stderr, "------------nEXE RESULT: %sn------------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 sysn" +                                       
        "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());                           
}

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                                                                    
#include                                                                     
#include                                                                     
#include                                                                     
#include                                                                   

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);                                              

注意其中的Makefile文件:

  1. 需要include python.h 所在目录,即python的include目录
  2. C++编译参数加入-std=c++11:
    CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’)
  3. include glog所在目录

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

tree
 

执行结果:
这里写图片描述

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.htm

Python脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 语言的发展简史 http://www.linuxidc.com/Linux/2014-09/107206.htm

Python 的详细介绍请点这里
Python 的下载地址请点这里

未经允许不得转载:演道网 » C++调用Python实例

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册