C中嵌入python
嵌入
与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的更多相关文章
- 在应用中嵌入Python:转
在应用中嵌入Python 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python ...
- c++中嵌入python
c++ 中嵌入python : https://blog.csdn.net/yiyouxian/article/category/6324494 Python C 和线程 :http://www. ...
- 【转】C++中嵌入python程序——参数传递
C++中嵌入python程序——参数传递 前面两篇博客已经介绍如何在C++中嵌套使用 python,但是在实际使用中,我们需要向python传递各种各样的参数,这样的程序才具有更高的灵活性.下面简单介 ...
- 如何在 Go 中嵌入 Python
如果你看一下 新的 Datadog Agent,你可能会注意到大部分代码库是用 Go 编写的,尽管我们用来收集指标的检查仍然是用 Python 编写的.这大概是因为 Datadog Agent 是一个 ...
- 在 C 代码中嵌入 Python 语句或使用 Python 模块 (Visual Studio 2013 环境设置)
1) 新建一个 内嵌 Python 语句的 C 代码, // This is a test for check insert the Python statements or module in C. ...
- 如何在batch脚本中嵌入python代码
老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单: REM timeit.bat echo %TIME% ...
- C++中嵌入python程序——命令行模式
http://blog.csdn.net/yiyouxian/article/details/51992721
- 嵌入Python | 调用Python模块中有参数的函数
开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...
- 在C语言中如何嵌入python脚本
最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌 ...
随机推荐
- 执行shell出现bad interpreter
执行shell出现bad interpreter:No such file or directory linux执行shell出现bad interpreter:No such file or dir ...
- espcms特殊标签
内页banner图从后台调用分类图片 <div style="background:url({%$rootdir%}{%find:type class=$type.topid out= ...
- PHP 基础(赋值及函数)
开端<?php>结尾</php> 弱类型语言 定义变量的时候 不需要 声明 但是 每一个变量前 都必须 加$ 符号 储存文件按 统一放到 安装文件夹下面的 WA ...
- tp5 中 model 的聚合查询
方法 说明 Count 统计数量,参数是要统计的字段名(可选) Max 获取最大值,参数是要统计的字段名(必须) Min 获取最小值,参数是要统计的字段名(必须) Avg 获取平均值,参数是要统计的字 ...
- 【转载】CentOS服务器配置VPN详解
转载来自: https://bbs.aliyun.com/read/162297.html http://www.wanghailin.cn/centos-7-vpn/ 操作系统:CentOS 6.3 ...
- windows 10 设置
精简应用 邮件和日历: Get-AppxPackage *communi* | Remove-AppxPackage 新闻: Get-AppxPackage *bing* | Remove-AppxP ...
- 字符串的replace()方法隐藏着什么不可告人秘密?
最近在做JS算法项目时发现一个令我匪夷所思的问题, 这里想记录一下问题. 首先介绍一下字符串replace()方法的基本用法. replace() 方法使用一个替换值(replacement)替换掉一 ...
- EXT.NET 使用总结(1)
前言 从系统改版到现在,将近半年的时间,原本陌生的Ext.NET的UI框架,也慢慢的熟悉了.总的来说,这个UI框架还是很优秀的,但是也没有100%完美的产品(老系统使用easy ui其实也挺好的).趁 ...
- selenium实战-Compound class names not permitted
这个复合类其实就是嵌套类,使用最后一个作为类名即可
- 论SOA架构的几种主要开发方式
转: http://blog.csdn.net/chenleixing/article/details/44926955 面向服务架构soa以其独特的优势越来越受到企业的重视,它可以根据需求通过网络 ...