嵌入

与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. 摄像头视频捕捉(简单通用--通过IsampleGrabberCB实现)

    前言 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布.DirectShow为多媒体流的捕捉和回放提供了强有力的支持.用Direct ...

  2. python之路九

    paramiko paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 ssh执行命令: import paramikossh = pa ...

  3. Huffman Tree

    哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...

  4. October 15th 2016 Week 42nd Saturday

    Word to World. There are only two kinds of people who are really fascinating, people who know absolu ...

  5. 配置使用EF常见的一些问题及解决方案

    转自http://www.2cto.com/database/201511/449573.html 提示未注册,找不到驱动程序 No Entity Framework provider found f ...

  6. 利用python的双向队列(Deque)数据结构实现回文检测的算法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  7. 高性能PHP框架thinkphp5.0.0 Beta发布-为API开发而设计

    ThinkPHP V5.——为API开发而设计的高性能框架 ThinkPHP5..0版本是一个颠覆和重构版本,采用全新的架构思想,引入了很多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...

  8. Logistic回归的使用

    Logistic回归的使用和缺失值的处理 从疝气病预测病马的死亡率 数据集: UCI上的数据,368个样本,28个特征 测试方法: 交叉测试 实现细节: 1.数据中因为存在缺失值所以要进行预处理,这点 ...

  9. MIT 6.828 JOS学习笔记5. Exercise 1.3

    Lab 1 Exercise 3 设置一个断点在地址0x7c00处,这是boot sector被加载的位置.然后让程序继续运行直到这个断点.跟踪/boot/boot.S文件的每一条指令,同时使用boo ...

  10. Linux UBI子系统设计初探

    问题领域 flash存储设备存在如下特点: 存在坏块 使用寿命较短 存储介质不稳定 读写速度慢 不支持随机访问(nand) 只能通过擦除将0改成1 最小读写单位为page or sub-page 便宜 ...