嵌入

与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. 群体结构图形三剑客——PCA图

    重测序便宜了,群体的测序和分析也多了起来.群体结构分析,是重测序最常见的分析内容.群体结构分析应用十分广泛,首先其本身是群体进化关系分析里面最基础的分析内容,其次在进行GWAS分析的时候,本身也需要使 ...

  2. mapReduce编程之Recommender System

    1 协同过滤算法 协同过滤算法是现在推荐系统的一种常用算法.分为user-CF和item-CF. 本文的电影推荐系统使用的是item-CF,主要是由于用户数远远大于电影数,构建矩阵的代价更小:另外,电 ...

  3. 各大安卓应用市场APP上传提交与收录

    360 提交网址 应用宝 提交网址 百度 提交网址 91 提交网址 安卓 提交网址 PP助手 提交网址 小米 提交网址 华为 提交网址 OPPO 提交网址 魅族 提交网址 乐视 提交网址 豌豆荚 提交 ...

  4. ACM-ICPC如何起步

    刚刚绝定投身ACM-ICPC的同学先要过两关. 第一关:程序设计语言 如果学校有开设相关课程,则省去了很多麻烦.如果没有则可以选择<程序设计导引及在线实践>作为教材.现在的比赛中允许使用的 ...

  5. 无法启动"D\projects\hello\Debug\hello.exe" 系统找不到指定的文件。[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]

    这两天安装Visual Studio遇到这样的一个问题,用自己的电脑和公司的电脑都出现同样的问题.两台电脑都是新系统,按理来说是没有问题的.但是一出现问题,对于我这个小白来说,还是耗费了挺多精力都无果 ...

  6. grep 正则表达式

    本文转自:http://www.jb51.net/article/31207.htm 正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串.vim.grep.aw ...

  7. 利用Photos 框架搭建美图秀秀相册选择器

    简介:Photos框架是iOS8.0后推出的一个新的用于对系统相册进行相关操作的,在iOS8.0之前,开发中只能使用AssetsLibrary框架来访问移动设备的图片库.本文中不再对AssetsLib ...

  8. [转] CC 命令

    1.最基本的操作cleartool co -nc xxx.cppcleartool ci -nc xxx.cpp 2.查看自己总共co了多少文件cleartool lscheckout -cview ...

  9. python环境变量自动配置脚本(setx使用)

    前言 setx不是windows系统自带的工具,需要到微软官网下载,但是有的系统也会自带.(是官方提供的,可放心食用) set和setx都可以用来配置环境变量.他们的不同点在于,set只是临时的修改环 ...

  10. [.NET]二维码生成

    又好一段时间没有写写东西了,继续回归原来的模式,多做记录,最近要实现个unity的二维码方面的功能,首先就要解决生成二维码的问题,这个倒是有这方面的组件,然后我通过强大的反编译工具Reflector( ...