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窗 ...
随机推荐
- 在Eclipse中怎样写Java注释
java中的注释分为实现注释和文档注释 实现注释就是那些/……../和//……的注释,是注释程序用的,文档注释是/*……./的注释,是用来生成javadoc的.设置方法如下: 1.打开Eclipse的 ...
- 搭建SpringMVC+MyBatis开发框架四
在src/main下面新建一个resouces文件夹,我们继续配置一些资源 1.新增applicationContext.xml:  <?xml version="1.0" ...
- 五、案例-指令参考-freemarker指令、表达式
案例-指令参考描述:本人自己测试写了一遍,如有错的地方,懂freemarker的朋友望指点指点! 案例-指令参考 表达式 一. Assign 1.<#assign name1="北京& ...
- adb 连接时 device offline
继上一篇博文,会发现最后图片上 adb连接时候提示device offline 以下三种方法可以试一下~我是试到最后一种才成功 1.重启手机 2.adb kill-server adb star ...
- 1.项目开发-->Memcached之ASP.NET实现
1.Memcached安装 第一步:下载windows稳定版Memcached 1.2.1 win32,解压后,将memcached.exe文件放到自己想存放的盘符内,例如C:\Windows\Sys ...
- Mybatis错误调试(二)
错误日志信息: Caused by: java.sql.BatchUpdateException: ORA-00911: 无效字符 at oracle.jdbc.driver.OraclePrepa ...
- 如何撰写SCI论文的讨论部分?——经典结构 – 俗称“倒漏斗型。
- 系统使用 aspose.cell , 使得ashx第一次访问会变很慢
网站放在IIS后, 在网站第一次访问后. 回收应用程序池 第一次访问aspx页面还是比较快. 但第一次访问ashx会很慢. 后发现原因: aspose.cell的5.3...版本. 的原 ...
- ios 编码转换 保存文件
- (NSString *)SaveFileToDocuments:(NSString *)url { // NSString *url = @"http://172.28.250.70/a ...
- [翻译]Kafka Streams简介: 让流处理变得更简单
Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...