Python嵌入C++(2)

python嵌入c/c++    学习python是一个令人振奋不已的过程,python是一个如此powerfull的高级语言,简单却功能强大,库多而又功能齐全,几乎可以帮助我们完成任何一项工作。它唯一的缺陷就是跑得慢,在跑得慢的问题上,它有有着令人振奋的解决方案,嵌入c/c++代码的方法。一个程序80%的时间运行在20%的代码上,我们只要用c重写那20%的代码,便可缔造完美程序。   除了运行速度问题,还有其他可以用c来增 阅读详情

Python嵌入C++(2)
                               在C++中调用python模块。

要在C++中调用python模块,事实上比较复杂,总结如下:
(1)导入要调用函数所在的模块。
(2)在相应的模块中获取要调用的对象。
(3)调用相应的函数。

对于第三步,根据模块中的函数是无参数还是有参数,又可分别对待。对于无参数的函数,上面的三步即可满足要求,但对于有参数的函数,还得扩展上面的第三步,总结如下:
(1)导入要调用函数所在的模块。
(2)在相应的模块中获取要调用的对象。
(3)把要作为参数提供给Python模块的所有C++变量建立参数对象。
(4)调用相应的函数,并为之提供相应的参数。
(5)如果函数有返回值,把返回的值转换为C++变量。

对上面的无参数函数模块的调用示例如下:

(以下示例均在VS.NET 2003及Dev-C++4.9.9.0下面调试通过.)
#include "python.h"

int main(int argc,char** argv)
{
 Py_Initialize();
 
 PyObject *myMod = NULL,
   *myFunc = NULL;

 myMod = PyImport_ImportModule("PythonInC"); //First step.
 myFunc = PyObject_GetAttrString(myMod,"Hello");//Second step.
 PyEval_CallObject(myFunc,NULL);   //Third step.
 
 Py_Finalize();

 return (1);
}
其中的模块定义如下:
#Test for mudule nest in C++.
def Hello():
 print "Hello,world"
下面给出上面示例中用到的函数原型。
PyObject* PyImport ImportModule(char *name)
Return value: New reference.
This is a simplified interface to PyImport ImportModuleEx() below, leaving the globals and locals
arguments set to NULL. When the name argument contains a dot (when it specifies a submodule of a
package), the fromlist argument is set to the list ['*'] so that the return value is the named module
rather than the top-level package containing it as would otherwise be the case. (Unfortunately,
this has an additional side effect when name in fact specifies a subpackage instead of a submodule:
the submodules specified in the package's all variable are loaded.) Return a new reference
to the imported module, or NULL with an exception set on failure (the module may still be created
in this case | examine sys.modules to find out).

PyObject* PyObject GetAttrString(PyObject *o, char *attr name)
Return value: New reference.
Retrieve an attribute named attr name from object o. Returns the attribute value on success, or
NULL on failure. This is the equivalent of the Python expression `o.attr name'.

下面再来个无返回值单参数的示例:
#include "python.h"
#include <cassert>

int main(int argc,char** argv)
{
 Py_Initialize();
 
 PyObject *myMod = NULL,
   *myFunc = NULL,
   *myArg = NULL;

 myMod = PyImport_ImportModule("PythonInC_1"); //First step.

#ifndef NDEBUG
#define NDEBUG
 assert(PyObject_HasAttrString(myMod,"Hello");
#undef NDEBUG
#endif

 myFunc = PyObject_GetAttrString(myMod,"Hello");//Second step.

 myArg = Py_BuildValue("(s)","Bluejugar"); //Third step.

 PyEval_CallObject(myFunc,myArg);  //Fourth step.

 Py_Finalize();

 return (1);
}
模块定义为:
PythonInC_1.py:
#Test for single argument function calling.
def Hello(who):
 print 'Hello,',who,'!'
新增加函数的原型:
PyObject* Py BuildValue(char *format, ...)
Return value: New reference.
Create a new value based on a format string similar to those accepted by the PyArg Parse*()
family of functions and a sequence of values. Returns the value or NULL in the case of an error;
an exception will be raised if NULL is returned.

有返回值单参数的示例:
#include "python.h"
#include <cassert>
#include <iostream>

int main(int argc,char** argv)
{
 Py_Initialize();
 
 PyObject *myMod = NULL,
   *myFunc = NULL,
   *myArg = NULL,
   *myRet = NULL;

 myMod = PyImport_ImportModule("PythonInC_2");

#ifndef NDEBUG
#define NDEBUG
 assert(PyObject_HasAttrString(myMod,"Hello");
#undef NDEBUG
#endif

 myFunc = PyObject_GetAttrString(myMod,"Hello");

 myArg = Py_BuildValue("(s)","Bluejugar");

 myRet = PyEval_CallObject(myFunc,myArg);

 char* sRet = NULL;
 PyArg_Parse(myRet,"s",&sRet);

 std::cout<<sRet<<std::endl;

 Py_Finalize();

 return (1);
}
其中的模块重新定义为:
PythonInC_2.py:
#Test for single argument and return value.
def Hello(who):
 word = "Hello, " + who + "."
 return word

对于模块中的多参数函数,对其传入多个参数时,是传入将每个参数定义成一个对象传入,还是将它们各自定义成一个对象传入?我现在也不是很清楚该怎么做,有些例子上是使用了tuple.
示例如下:
#include "python.h"
#include <cassert>
#include <iostream>

int main(int argc,char** argv)
{
 Py_Initialize();
 
 PyObject *myMod = NULL,
   *myFunc = NULL,
   *myArgs = NULL,
   *myRet = NULL;

 myMod = PyImport_ImportModule("PythonInC_3");

#ifndef NDEBUG
#define NDEBUG
 assert(PyObject_HasAttrString(myMod,"Add");
#undef NDEBUG
#endif

 myFunc = PyObject_GetAttrString(myMod,"Add");

 myArgs = PyTuple_New(2);
 PyTuple_SetItem(myArgs,0,Py_BuildValue("i",2000) );
 PyTuple_SetItem(myArgs,1,Py_BuildValue("i",8) );

 myRet = PyEval_CallObject(myFunc,myArgs);

 int nRet = 0;

 PyArg_Parse(myRet,"i",&nRet);

 std::cout<<nRet<<std::endl;

 Py_Finalize();

 return (1);
}
模块定义:
PythonInC_3.py:
#Test for multi-arguments.
def Add(nA,nB):
 return (nA + nB)

突然发现动态语言(如Python)竟然先天支持GP(generic programming),很是感触。

附注:虽然开始说是像记日记一样把每日所得记下来,但后来发现如果真是这样,那还是只能写下一些行云流水般的东西,每隔几天,总结一下,再写下来,才算是有所悟,有所得啊.不过这篇文章本来早就写了,不料csdn的blog这几天老是出"运行时错误",听说用的是伪软的ASP.net.哎,看来,伪软的东西也是怎的不怎的啊.("怎"字拼成"za",念三声,"的"字拼成"di",念四声.)

函数||值传递||函数的常见样式||函数的声明||函数的分文件编写 概述 作用:将一段经常使用的代码封装起来,减少重复代码 一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。 函数的定义 函数的定义一般主要有5个步骤: 1、返回值类型 2、函数名 3、参数表列 4、函数体语句 5、return 表达式 #include <iostream> using namespace std; //函数定义 int add(i... 阅读详情

相关推荐

一次带你理清 ‘ || ’ 和 ‘ && ’ 和 ‘ ^ ’ 等常用操作符以及其余基本操作符

1.操作符分类 1.算数操作符 + - * / % 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 % 操作符的两个操作数必须为整数。返回的是整除之后的余数。 例如: int a=5; int b=4; int c=5/3 --结果为1 除法结果为取商 // int c=5/3.0 -- 此时,由于除号两边有一边为浮

这个人很懒, 什么都没留下(这是我写的) 5252

C++ 函数指针的用法

从语法上讲,有两种不兼容的函数指针形式: (1)    指向C语言函数和C++静态成员函数的函数指针 (2)    指向C++非静态成员函数的函数指针 不兼容的原因是因为在使用C++非静态成员函数的函数指针时,需要一个指向类的实例的this指针,而前一类不需要。 3.1 定义一个函数指针 指针是变量,所以函数指针也是变量,因此可以使用变量定义的方式来定义函数指针,对于普通的指针,可以这么

u013161016的专栏 1360

运算符“||”与“|”,“&&”和“&”的区别

逻辑或运算符:“||”是短路或运算符,用于条件判断;“|”是按位或运算符,用于二进制数据的位操作。逻辑与运算符:“&&”是短路与运算符,用于条件判断;“&”是按位与运算符,用于二进制数据的位操作。理解这些运算符的区别和用法对于编写高效、可靠的程序至关重要。希望本文能帮助读者更好地掌握这些运算符,并在编程实践中灵活运用它们。

qq_51321722的博客 9490

这份工具清单,令Python 提速N倍,简直太好用了

在众多编程语言中,Python的社区生态是其中的佼佼者之一。几乎所有的技术痛点,例如优化代码提升速度,在社区内都有很多成功的解决方案。

轻松学python的博客 1377

TensorFlow-v2.9物联网部署:轻量级设备适配实战

本文介绍了如何在星图GPU平台上自动化部署TensorFlow-v2.9镜像,以解决AI模型在物联网轻量级设备上的部署难题。通过该平台,开发者可快速利用TensorFlow Lite等工具对模型进行量化与优化,并将其高效部署至树莓派等边缘设备,实现如设备故障预测、智能视觉识别等典型物联网应用场景。

weixin_42589700的博客 305

Python vs C++:MIPI RAW 10bit转16bit性能对比与实战代码解析

本文深入对比了PythonC++在MIPI RAW 10bit转16bit数据处理中的性能差异,提供了实战代码解析与优化方案。通过AVX2指令集优化和NumPy实现,展示了两种语言在嵌入式图像处理中的适用场景,帮助开发者在开发效率与执行性能之间做出平衡决策。

weixin_42519733的博客 268

Python嵌入C++(1)

Python嵌入C++之HelloWorldPythonC++嵌入是我学习Python的初衷,所以刚刚看了点Python的语法,我就来到了这一章节的学习。首先,先看看Python manuals中的一个例程,这个例程在"5.1 Very High Level Embedding"中提到。#include  /*这里的"Python.h"基本是对所有python头文件的打包,大家可以看其源代码。

第五年 2558

python嵌入c代码_如何嵌入Python代码到C程序

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。Python是最流行的编程语言之一,这归功于其简单的语法,易学和跨平台支持。此外还由于,很多高质量的Python库和模块可任意使用,仅仅几行代码就允许你完成繁重的工作。这使得Python成为开发原型最有效的方法之一。然而,Python没有C语言快,而且很多性能很重要的软件产品如Linux操作系统,web服务...

weixin_39643189的博客 986

c嵌入python_在C中嵌入Python并从C代码调用方法

我尝试将Python脚本嵌入到我的C程序中.在阅读了有关嵌入和扩展的一些内容之后,我了解了如何打开自己的python脚本以及如何将一些整数传递给它.但现在我有点不明白如何解决我的问题.我必须做两件事,从C调用Python函数并从我的嵌入Python脚本调用C函数.但我不知道从哪里开始.我知道我必须编译一个.so文件来将我的C函数暴露给Python,但这不是我能做的,因为我必须嵌入我的Python...

weixin_39690958的博客 773

C语言中嵌入Python

1.为什么要嵌入python? 这个问题问的好,一般静态语言与脚本语言(不仅仅是python),相互搭配,有两种方式,一种是用c语言写好模块,然后用python去整合,也被称之为扩展python,这样的好处是即有python的灵活性,又有c语言的效率,还有一种就是c语言嵌入python,这样我们就有了一个python解释器了,在游戏编程中常用这种方法,如果你是用静态语言编程,那么修改一些属性,就

vampirem的专栏 3810

python嵌入到程序_怎样把Python代码嵌入到C程序

怎样把Python代码嵌入到C程序步骤1:安装Python开发包 由于需要访问Python/C API,首先安装Python开发包。 在Debian,Ubuntu或Linux Mint中: 在CentOS,Fedora或RHEL中: 安装成功后,Python头文件在/usr/include/python2.7。根据Linux发行版的不同。C程序用Python做插件该怎么实现Python 是一种用于...

weixin_39531834的博客 544

python嵌入c_python嵌入到c

Python在开发实时嵌入式系统中的作用在过去的几年里,Python已经成为一种热门的程序语言。以著名的Monty Python喜剧小组命名,该语言是面向对象和解释(未编译)。该属性导致Python在Linux和Windows等平台上以及Raspberry Pi等单板计算机上被采用。随着这种广泛且不断增长的采用,人们可能想知道在实时嵌入...文章朗锐智科12019-01-112510浏览量Pyth...

weixin_39827506的博客 400

在C/C++嵌入Python

8.2  在C/C++嵌入Python在C/C++嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进制的动态链接库。8.2.1  高层次嵌入Python使用Python/C API可以在较高层次上嵌入Python。所谓的高层次嵌入主要是指程序与脚本间没有交互。在VC++ 6.0中

XRZEngine的专栏 1402

python可以嵌入c语言吗_Python嵌入C/C++进行开发详解

如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录。下面我们来看下如何把Python嵌入C/C++中。VC6.0下,打开 tools->options->directories->show directories for,将Python安装目录下的inlude目录添加到inlude files项中,将...

weixin_39817347的博客 1094

在C语言中嵌入Python

在C语言中嵌入Python 使用PyRun_SimpleString函数 例子如下 #include int main() { Py_Initialize();//初始化Python解释器 PyRun_SimpleString("print 'hi , Python' "); //运行字符串 //执行文件可以使用 PyRun_SimpleString("execfile('filen

nancygreen的专栏 2047

嵌入python c++_嵌入式系统中的Python与C / C ++

嵌入python c++ 尽管C / C ++编程语言有很多缺点,但它们在嵌入式系统编程中占主导地位。 另一方面,Python具有许多优势,使其成为嵌入式系统的绝佳语言。 让我们看一下每种方法的优缺点,以及为什么应该考虑将Python用于嵌入式编程。 C / C ++是编译语言,而Python是解释语言。 C / C ++已经存在了很长时间。 C最早是在1969年开发的,而C ++则是在1...

cumj63710的博客 857

C语言嵌入Python的3种方式,第2种90%的人从未用过

掌握C/Python混合编程性能优化的3种实用方法,重点揭秘90%开发者忽略的嵌入技巧。涵盖C扩展、PyBind11与Python内嵌C代码的应用场景与执行优势,提升运行效率。值得收藏

FastDebug的博客 1039

python嵌入到程序_怎样把Python代码嵌入到C程序?

前言:Python是最流行的编程语言之一,这归功于其简单的语法,易学和跨平台支持。此外还由于,很多高质量的Python库和模块可任意使用,仅仅几行代码就允许你完成繁重的工作。这使得Python成为开发原型最有效的方法之一。然而,Python没有C语言快,而且很多性能很重要的软件产品如Linux操作系统,web服务器和数据库都是用C编写的。如果你用C开发一个程序,但是它的某些部分需要用Python编...

weixin_39593340的博客 494
上一篇: Python嵌入C++(1)
下一篇: DEP:关于Windows XP SP2中的安全性能的提高
bluejugar
博客等级 码龄23年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值