歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++調用Python實例

C++調用Python實例

日期:2017/3/1 9:14:50   编辑:Linux編程

本文以實例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([email protected])                          
 * @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);                               



src/util.cpp:

/***************************************************************************     
 *-                                                                              
 * Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved                        
 *-                                                                              
 **************************************************************************/     
-                                                                                
-                                                                                
-                                                                                
/**                                                                              
 * @file src/util.cpp                                                            
 * @author zhangruiqing01([email protected])                              
 * @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());                           
}



main.cpp:

/***************************************************************************         
 *-                                                                                  
 * Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved                            
 *-                                                                                  
 **************************************************************************/         
-                                                                                    
-                                                                                    
-                                                                                    
/**                                                                                  
 * @file src/util.cpp                                                                
 * @author zhangruiqing01([email protected])                                  
 * @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);                                              

注意其中的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.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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved