本文以实例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
  • 1
  • 2
  • 3

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 command
void exe_py(
const std::string module_name,
const std::string func_name,
const std::vector<std::string>& args);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

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 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());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

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 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

注意其中的Makefile文件:

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

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

执行结果: 

 
 
from: http://blog.csdn.net/abcjennifer/article/details/49377123

C++调用python的更多相关文章

  1. cpp 调用python

    在用cpp调用python时, 出现致命错误: no module named site  ,  原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...

  2. c调用python

    #include <Python.h>//python33(python2.x有几个函数不对应) /* PyImport_ImportModule 导入一个Python模块并返回它的指针 ...

  3. linux+php+apache web调用python脚本权限问题解决方案

    lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...

  4. linux+php+apache web调用python脚本权限问题

    lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...

  5. C#中调用python方法

    最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...

  6. PHP 调用Python脚本

    上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apac ...

  7. C++中调用Python脚本

    C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...

  8. java调用python代码

    同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...

  9. C#调用Python 脚本语言

    1. 安装IronPython http://pan.baidu.com/s/1qW4jNJ2  下载IronPython 2.7 安装下载下来的安装包 2. 创建项目 创建一个C#的Windows窗 ...

随机推荐

  1. ELK:kibana使用的lucene查询语法

    kibana在ELK阵营中用来查询展示数据elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 kibana4官方演示页面 全文搜索 在搜索栏输入login,会返回所有字段值 ...

  2. android 开发 drawerlayout出现退不回去的情况

    问题原因: id_framelayout2 写在 id_linearlayout2 的后面了: 注意记得写: android:layout_gravity="start" 正确: ...

  3. Java 调用 Javascript 函数的范例

    在Java 7 以后,可以在Java代码中调用javascript中的函数,请看下面的例子: package com.lee; import java.io.FileNotFoundException ...

  4. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  5. boost之function

    boost中function是对函数指针和函数对象的进行封装的模板类. 定义示例:function<int()> func生成一个空的对象,表示函数参数个数为零,返回类型为int. #in ...

  6. hdu 1075 What Are You Talking About

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 题意:比较简单,易懂,这里不做说明. 解法:第一种方法:用map映射,耗时1000+ms:第二种 ...

  7. JSP页面批量选择&全选操作&选择回显

    效果如下: js验证部分: 页面body部分: 附:控制器Controller中验证批量选择条件回显:

  8. html之colspan && rowspan讲解

    1.colspan && rowspan均在td标签中使用 2.每个单元格大小一致的前提 <table border="1" bordercolor=&quo ...

  9. [转]layoutSubviews总结

    原文链接找不到了,转的时候别人也是转载的,但并未留下原创链接,就当是笔记了. ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)s ...

  10. eclipse 自动 注释

    在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的. 修改作者.日期注释格式:打开Windows->Preferences->Java->Co ...