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,并在其中嵌 ...
随机推荐
- 委托 与 Lambda
一.委托调用方式 1. 最原始版本: delegate string PlusStringHandle(string x, string y); class Program { static void ...
- screen 常用命令
screen -r <id | name> # 进入 screen C-a c # ctrl+a + c , 新建screen窗口 C-a A # ctrl+a + A, 命名scree ...
- linuxqq
centos7下安装linuxqq出现一大堆依赖包都没有,腾讯搞的这个产品真不给力.寒心. >>>以下来自百度知道:http://zhidao.baidu.com/question/ ...
- placeholer 换行
如果需要placeholder 换行: 代码: <textarea class="desc_content"maxlength="50" placehol ...
- UIImage加载本地图片的两种方式
UIImage加载图片方式一般有两种: (1)imagedNamed初始化:默认加载图片成功后会内存中缓存图片,这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象.如果缓存中没有找到相应的图片 ...
- Git学习总结
master主分支合并dev分支,代码 :git merge dev ,跳出如下界面.输入:wq,(:wq命令是LINUX命令,强制写入文件并结束),可以强制合并.但为什么会跳出该界面,我也没搞清楚. ...
- 打开APK里的AndroidManifest.xml乱码
直接解压apk,打开AndroidManifest.xml显示乱码,因为这里面是二进制字符,和打开文件的编辑器无关.(也可以用ultraedit打开查看,有明文显示.只是看起来搜起来不是很方便而已) ...
- ORACLE用户创建&删除
●sqlplus登陆sqlplus sys/isc@testgmmc as sysdba●创建用户create user testpoi3 IDENTIFIED by iscaccount unloc ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- [LeetCode] Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...