嵌入

与python的扩展相对,嵌入是把Python解释器包装到C的程序中。这样做可以给大型的,单一的,要求严格的,私有的并且(或者)极其重要的应用程序内嵌Python解释器的能力。一旦内嵌了Python,世界完全不一样了。

C调用python中的函数:

hw.py:

#coding=utf8

def hw_hs(canshu):
    return canshu

if __name__  == "__main__":
    ccss = "I am hw"
    print hw_hs(ccss)

helloWorld.py:

#coding=utf8
import hw

def hello():
    ccss = "I am helloWorld"
    return hw.hw_hs(ccss)

if __name__  == "__main__":
    print hello()

testcpypy.c:

//#include "testcpypy.h"
#include <Python.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    //初始化Python
    Py_Initialize();
    if (!Py_IsInitialized()) {
        printf("Py_Initialize");
        getchar();
        ;
    }      

    //执行python语句
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    PyObject *pModule = NULL;
    PyObject *pFunc = NULL;
    PyObject *reslt =NULL;

    //载入python模块
    if(!(pModule = PyImport_ImportModule("helloWorld"))) {
        printf("PyImport_ImportModule");
        getchar();
        ;
    }

    //查找函数
    pFunc = PyObject_GetAttrString(pModule, "hello");
    if ( !pFunc || !PyCallable_Check(pFunc) )
    {
        printf("can't find function [hello]");
        getchar();
        ;
    }

    //调用python中的函数
    reslt = (PyObject*)PyEval_CallObject(pFunc, NULL);
    //printf("function return value : %d\r\n", PyInt_AsLong(reslt));  

    //将python返回的对象转换为C的字符串
    char *resltc=NULL;
    int res;
    res = PyArg_Parse(reslt, "s", &resltc);
    if (!res) {
        printf("PyArg_Parse");
        getchar();
        ;
    }
    printf("resltc is %s", resltc);
    getchar();

    //释放内存
    Py_DECREF(reslt);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);  

    //关闭python
    Py_Finalize();

    ;
}

编译:

gcc -o testcpypy testcpypy.c  -IC:\Python27\include -LC:\Python27\libs -lpython27    ---C:\Python27为python安装目录

或:
gcc -c testcpypy.c -IC:\Python27\include
gcc -o testcpypy.exe testcpypy.o -LC:\Python27\libs -lpython27

执行结果:


带参数的情况:

#include "callpydll.h"
#include "Python.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

int callhello(char *instr, char *outstr)
{

    PyObject *pModule = NULL;
    PyObject *pFunc = NULL;
    PyObject *reslt = NULL;
    PyObject *pParm = NULL;

    char *resltc = NULL;
    int resltn;
    int res;

    char *helloWorld = "TestIM_ProtocBuf";

    char *im_account = "aaaa";
    char *auth_code = "aaaa";
    char *im_uid = "aaaa";
    char *proxy_topic = "";

    //初始化Python
    Py_Initialize();
    if (!Py_IsInitialized()) {
        printf("Py_Initialize");
        getchar();
        ;
    }      

    //执行python语句
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    //载入python模块
    if(!(pModule = PyImport_ImportModule(helloWorld))) {
        printf("PyImport_ImportModule");
        getchar();
        ;
    }

    //查找函数
    pFunc = PyObject_GetAttrString(pModule, "login_proxy_body_serialize");
    if ( !pFunc || !PyCallable_Check(pFunc) )
    {
        printf("can't find function [hello]");
        getchar();
        ;
    }

    //参数转换C --> python, 参数必须是元组(一个参数也是,否则会失败!!!坑啊)
    pParm = Py_BuildValue("(ssss)", im_account, auth_code, im_uid, proxy_topic);

    //调用python中的函数
    reslt = (PyObject*)PyEval_CallObject(pFunc, pParm);

    //将python返回的对象转换为C的字符串
    res = PyArg_ParseTuple(reslt, "si", &resltc, &resltn);
    if (!res) {
        printf("PyArg_Parse");
        getchar();
        ;
    }

    printf("resltn is %d", resltn);
    memcpy(outstr, resltc, strlen(resltc)+); 

    //释放内存
    Py_DECREF(reslt);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);
    Py_DECREF(pParm);

    //关闭python
    Py_Finalize();

    ;
}

int main() {
    int i;
    char *dais = "iammain";
    ];
    memset(res,'\0',sizeof(res));

    i = callhello(dais, res);
     != i) {
        printf("Notify:error");
        getchar();
        ;
    }
    printf("result is %s", res);
    getchar();
    ;
}

C中嵌入python的更多相关文章

  1. 在应用中嵌入Python:转

    在应用中嵌入Python 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python ...

  2. c++中嵌入python

    c++ 中嵌入python  :  https://blog.csdn.net/yiyouxian/article/category/6324494 Python C 和线程 :http://www. ...

  3. 【转】C++中嵌入python程序——参数传递

    C++中嵌入python程序——参数传递 前面两篇博客已经介绍如何在C++中嵌套使用 python,但是在实际使用中,我们需要向python传递各种各样的参数,这样的程序才具有更高的灵活性.下面简单介 ...

  4. 如何在 Go 中嵌入 Python

    如果你看一下 新的 Datadog Agent,你可能会注意到大部分代码库是用 Go 编写的,尽管我们用来收集指标的检查仍然是用 Python 编写的.这大概是因为 Datadog Agent 是一个 ...

  5. 在 C 代码中嵌入 Python 语句或使用 Python 模块 (Visual Studio 2013 环境设置)

    1) 新建一个 内嵌 Python 语句的 C 代码, // This is a test for check insert the Python statements or module in C. ...

  6. 如何在batch脚本中嵌入python代码

    老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单: REM timeit.bat echo %TIME% ...

  7. C++中嵌入python程序——命令行模式

    http://blog.csdn.net/yiyouxian/article/details/51992721

  8. 嵌入Python | 调用Python模块中有参数的函数

    开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...

  9. 在C语言中如何嵌入python脚本

    最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌 ...

随机推荐

  1. discuz上传图片提示附件文件无法保存

    两个可能: 1. 服务器文件夹权限不足 discuz附件保存在./data/attachments下,data文件夹的属性要求必须为777 #cd到data的上一级目录然后执行: data 2. 附件 ...

  2. PHP 面向对象

    封装与不封装的区别:   未封装 时 外部随意更改数据   数据 不需要判定 就可以执行    外部直接操作数据 封装:  外部同样可以对数据更改,但需要 调用  类里面的  函数  外部间接操作数据 ...

  3. String字符串去掉最后一个","号的几种方式

    String a = "struts-default.xml,struts-plugin.xml,struts.xml"; String[] bStrings = a.split( ...

  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列

    ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  http://www.cnblogs.com/panzi/p/5742089.html ASP.NET S ...

  5. Oracle行转列、列转行的Sql语句总结(转)

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...

  6. CSS3选择器介绍

    1.css3属性选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  7. PCA数据降维

    Principal Component Analysis 算法优缺点: 优点:降低数据复杂性,识别最重要的多个特征 缺点:不一定需要,且可能损失有用的信息 适用数据类型:数值型数据 算法思想: 降维的 ...

  8. Theano在windows下的安装及GPU加速

    安装环境:wondows 64bit Teano安装测试 1. Anaconda 安装 Anaconda是一个科学计算环境,自带的包管理器conda很强大.之所以选择它是因为它内置了python,以及 ...

  9. 我为什么喜欢用C#来做并发编程

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区. 硅谷才女朱赟(我的家 ...

  10. new 等于 malloc加构造函数

    1.new 是c++中的操作符,malloc是c 中的一个函数 2.new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员 ...