C++调用python
本文以实例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文件:
- 需要include python.h 所在目录,即python的include目录
- C++编译参数加入-std=c++11:
CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’) - include glog所在目录
最后看一下本文中程序的结构:
执行结果:
C++调用python的更多相关文章
- cpp 调用python
在用cpp调用python时, 出现致命错误: no module named site , 原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...
- c调用python
#include <Python.h>//python33(python2.x有几个函数不对应) /* PyImport_ImportModule 导入一个Python模块并返回它的指针 ...
- linux+php+apache web调用python脚本权限问题解决方案
lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...
- linux+php+apache web调用python脚本权限问题
lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...
- C#中调用python方法
最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...
- PHP 调用Python脚本
上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apac ...
- C++中调用Python脚本
C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...
- java调用python代码
同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...
- C#调用Python 脚本语言
1. 安装IronPython http://pan.baidu.com/s/1qW4jNJ2 下载IronPython 2.7 安装下载下来的安装包 2. 创建项目 创建一个C#的Windows窗 ...
随机推荐
- ELK:kibana使用的lucene查询语法
kibana在ELK阵营中用来查询展示数据elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 kibana4官方演示页面 全文搜索 在搜索栏输入login,会返回所有字段值 ...
- android 开发 drawerlayout出现退不回去的情况
问题原因: id_framelayout2 写在 id_linearlayout2 的后面了: 注意记得写: android:layout_gravity="start" 正确: ...
- Java 调用 Javascript 函数的范例
在Java 7 以后,可以在Java代码中调用javascript中的函数,请看下面的例子: package com.lee; import java.io.FileNotFoundException ...
- 在listener或者工具中使用spring容器中的bean实例
在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...
- boost之function
boost中function是对函数指针和函数对象的进行封装的模板类. 定义示例:function<int()> func生成一个空的对象,表示函数参数个数为零,返回类型为int. #in ...
- hdu 1075 What Are You Talking About
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 题意:比较简单,易懂,这里不做说明. 解法:第一种方法:用map映射,耗时1000+ms:第二种 ...
- JSP页面批量选择&全选操作&选择回显
效果如下: js验证部分: 页面body部分: 附:控制器Controller中验证批量选择条件回显:
- html之colspan && rowspan讲解
1.colspan && rowspan均在td标签中使用 2.每个单元格大小一致的前提 <table border="1" bordercolor=&quo ...
- [转]layoutSubviews总结
原文链接找不到了,转的时候别人也是转载的,但并未留下原创链接,就当是笔记了. ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)s ...
- eclipse 自动 注释
在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的. 修改作者.日期注释格式:打开Windows->Preferences->Java->Co ...