程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++調用python

C++調用python

編輯:關於C++

本文以實例code講解 C++ 調用 python 的方法。


本文在util.h中實現三個函數:

1. init_log: 用google log(glog)初始化log
2. exe_command: 由 C++ 執行 shell code
3. exe_py: C++調用python文件


Code:

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                                                             
#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& 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                                                                
#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, ------------
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& 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([email protected])                                  
 * @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::vectorpy_args(arg_v, arg_v + sizeof(arg_v)/sizeof(arg_v[0]));  
    exe_py(printargs, pr, py_args);                                              

注意其中的Makefile文件:

需要include python.h 所在目錄,即python的include目錄 C++編譯參數加入-std=c++11:
CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’) include glog所在目錄

最後看一下本文中程序的結構:


tree

 <喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPta00NC94bn7o7o8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20151024/2015102409333684.png" title="" />

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved