本文以實例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:最後看一下本文中程序的結構:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPta00NC94bn7o7o8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/151028/042JH251-1.png" title="" />