C++程序员学Python:C与Python进行交互

摘要:
1.当C调用python时,C和python之间的交互非常简单。最简单的例子是:1Py_Initialize();23PyRun_ SimpleString(“str=\”hello\“”);4PyRun_ SimpleString(“printstr”);56Py_定案();就像C在进入主函数之前必须做一些准备一样,所有与Python交互的程序都以Py_Initaliz开头

1.C调用python

其实C与python的交互很简单,最简单的就是下面的例子:

1 Py_Initialize();
2 
3 PyRun_SimpleString("str = \"hello\"");
4 PyRun_SimpleString("print str");
5 
6 Py_Finalize();

与C在进入main函数前要做一些准备工作一样,所有要与python进行交互的程序开头都是以Py_Initialize()开头,无非就是申请一些预备的资源,结尾用Py_Finalize()释放申请的资源,C程序在main函数完毕后也会进行资源的申请释放,只不过C程序都是编译器帮我们处理好的

上面的代码其实就是在python的解释器里面输入

str = "hello"

print str

跟你利用IDLE进行输入差不多

在我们进行函数调用的时候,我们需要知道函数名,函数的形参,以及函数的返回值,C调用python函数的过程也大抵如此

python程序:

1 def hello(i):
2     print i
3     return i
 1     Py_Initialize();
 2 
 3     PyObject *pyMod = PyImport_ImportModule("test2");
 4     PyObject *pyFunc = PyObject_GetAttrString(pyMod,"hello");
 5 
 6     PyObject *pyParams = PyTuple_New(1);                     //申请tuple用以传入参数
 7     PyObject *pyValue  = PyString_FromString("2");
 8     PyTuple_SetItem(pyParams,0,pyValue);
 9 
10     pyValue = PyObject_CallObject(pyFunc,pyParams);
11 
12     if (pyValue)
13     {
14         int pRet = PyFloat_AsDouble(pyValue);16     }
17     Py_Finalize();

在我们调用python的函数的时候,我们需要知道函数所在的模块,这个就是PyImport_ImportModule的作用,引入test2模块(为什么不是直接test,因为python自身有test,如果你引入test那么你会找不到hello函数),跟你在python程序里面import一样,然后我们再利用PyObject_GetAttrString来获取这个模块中的函数,如果我们需要传入参数我们可以使用python中的Tuple,这让我想起了erlang,在 eshell里面一般也是通过列表来进行传参,然后我们通过PyObject_CallObject来调用函数,函数的返回值会保存在PyObject_CallObject的返回值里面,我们通过PyFloat_AsDouble来获取返回值(这个的返回值是2)

这样简单的C调用python的程序交互就完成了,当然上面为了方便我没有对错误进行检查

至于python的脚本,我还是比较建议接口不要写得太复杂,就像erlang建议提供给别人的接口一样,一般一个模块里面就start和end,这样即使以后出错,也方便调试

 还有就是在提供给用户的的时候,不一定要提供py文件,只要提供pyc文件就可以了

2.Python调用C程序

其实可以直接看collshell的博客,有个简单的例子

http://coolshell.cn/articles/671.html

不过在windows平台下需要注意,如果你的编译文件是cpp结尾的,那么需要在函数前面加上extern "C",如果C++比较熟悉的应该知道为什么,毕竟C++需要支持函数重载

免责声明:文章转载自《C++程序员学Python:C与Python进行交互》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇unittest中的Empty suite错误Vue2.0进阶组件 短信倒计时组件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

1-多线程与多进程

  一 进程与线程的概念 1.1 进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。你是不是已经想到在程序A读取数据的过程中,让程序B去...

日志回滚:python(日志分割)

日志回滚:python 什么是日志回滚? 答: 将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能。因此,有必要对日志文件按某种条件进行切分,要切分日志文件。 分割日志的触发条件:大小、日期,或者大小加上日期。 说是切分,实际上是,当一个日志文件达到触发条件后,对日志文件进行重命名,之后再新建原来名称的日志...

使用Python获取图片的物理尺寸(KB)

如何获取图片的物理尺寸,而非(width, height)? #! -*- coding: utf-8 -*- import requests import io url = "https://i.loli.net/2019/11/23/Q7NAVgfWp8YnhSl.jpg" image = requests.get(url).content #ima...

Python 打包发布exe可执行文件

Python 代码写完后有时候需要打包成exe可执行文件,以便于在windows 系统下运行。 好处:打包后的exe文件可用直接独立运行,目标服务器不需要单独安装python 环境 打包方式: 1. 安装pyinstaller,可使用pip进行安装 2. 执行pyinstaller 命令进行打包 例如:pyinstaller your_py_main_fi...

Python Twisted 学习系列21(转载stulife最棒的Twisted入门教程)

第二十一部分 惰性不是迟缓: Twisted和Haskell 简介 在上一个部分我们对比了Twisted与 Erlang,并将注意力集中在它们共有的一些思想上.结果表明使用Erlang也是非常简便的,因为异步I/O和反应式编程是Erlang运行时和进程模型的关键元素. 今天我们想走得更远一点,去看一看 Haskell —— 另一种功能性语言,然而与Erla...

C++——简单数据类型及布尔类型

一. 简单数据类型 数据类型描述了对象在内存存储区中占据的空间大小,描述了对象能够表示的数据范围 和类型。C++语言中常用的数据类型有整型、实型、字符型(这3种类型也被称之为简单数 据类型)、数组类型、布尔类型、枚举类型、结构体类型、公用体类型、指针类型、引用类 型等。 1.整形 整型按符号划分,可以分为有符号整型和无符号整型两大类,从长度划分,可以分为...