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:

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 <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);

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 <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());
}

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 <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);

注意其中的Makefile文件:

  1. 需要include python.h 所在目录,即python的include目录
  2. C++编译参数加入-std=c++11:

    CXXFLAGS(‘-g -pipe -W -Wall -fPIC -std=c++11’)

  3. include glog所在目录


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

执行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-14 02:16:01

C++调用python的相关文章

C++调用Python浅析

环境 VS2005Python2.5.4 Windows XP SP3 简述 一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性.而作为一门流行的通用型脚本语言python,也是可以做到的.在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据

C#调用python文件执行

我的电脑环境是使用.net framework4.5.1,如果在调试过程中调不通请注意 我用的是Visual studion 2017,python组件下载地址:http://ironpython.codeplex.com/releases/view/ 下载的版本是2.7,下载安装完之后记得引入安装路径下的以下三个dll (1)首先先说一个简单的功能,在c#代码中执行python字符串,内容如下: (2)c#调用python文件: 在当前目录下新建一个后缀名为py的文件,文件名为AmoutDis

编程:C#调用Python模块

当下,C#与Python都是比较热门的计算机编程语言,他们各有优缺点,如果能让他们互相配合工作,那是多么美好的事情,今天我来讲解一下如何利用C#来调用Python. 如果让C#支持调用Python模块,我们首先需要安装一些扩展,这里推荐使用IronPython库. 第一步,我们需要下载IronPython库的安装包,这里请大家移步官网 http://ironpython.codeplex.com/ ,下载并安装相关库文件. 第二步,我们新建一个C#控制台测试项目,并将IronPython安装目录

使用c语言调用python小结

最近在做一个漏洞展示平台,攻击实现部分使用python实现,c语言实现部分使用libcli库做一个类似telnet的东东,回调函数run的时候调用python模块.针对c调用python,做个了小demo python模块:demo.py def print_arg(str): print str def add(a,b): print 'a=', a print 'b=', b return a + b class Class_A: def __init__(self): print "ini

PHP 调用Python脚本

上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apache服务,具体环境(LAMP)搭建就不细说,主要分享php调用python脚本后台运行的处理. 1. PHP如何调用外部程序 首先要解决的问题就是php如何调用python脚本,在PHP中调用外部程序主要有两个函数,system和exec. system()原型:string system(stri

c#中调用python

1. 安装IronPython,到http://ironpython.codeplex.com/下载安装包 2. 创建项目 创建一个C#的控制台应用程序. 添加引用: 浏览到IronPython的安装目录中,添加对IronPython.dll,Microsoft.Scripting.dll 两个dll的引用. 3. 添加Python文件到当前的项目中 创建一个文本文件命名为:hello.py, 编辑如下 def welcome(name):    return "hello" + na

QT中 使用c++调用python

最近在做一个项目,开发环境用的是QT c++.项目中使用amazon云服务,调研发现有一个Amazon云的python接口.就有了标题中的问题,需要用C++来调用python脚本. 下面是一个c++调用python的小例子.我先贴出代码,然后在详细介绍. # -*- coding: cp936 -*- #定义hello函数,这个函数的功能是输出“hello world!” def hello(): print("hello world!") 上面就是我们一会要用C++调用python脚

浅析 C++ 调用 Python 模块

浅析 C++ 调用 Python 模块 作为一种胶水语言,Python 能够很容易地调用 C . C++ 等语言,也能够通过其他语言调用 Python 的模块. Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python 模块. 具体的文档参考官方指南: Embedding Python in Another Application 调用方法 1 链接到 Python 调用库 Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windo

Crontab里调用python脚本不成功的解决方案

crontab里经常会调用一些程序,但是很多时候调用python是不成功的,但是手动则是OK的,在看日志(/var/log/cron)的时候,却是显示正常,这种情况怎么破呢?其实主要就是这么几个地方: 1)轻易不要用if __name__ == "__main__": 很多主管都习惯让自己手下人把脚本写成模块化,然后潇洒的走一个整合,但是crontab对这个方法似乎不是很灵光,因为python运行的时候是从if __name__ == "__main__"开始执行,