热门回答:
你说的是在C/C++程序中调用Python吧。这个实现起来非常简单。只需要在头文件中引入Python.h文件。然后在编译的时候链接到Python库即可。下面我简单介绍一下。以Linux系统为例。感兴趣的朋友可以尝试一下:
01安装python-devel插件
首先。安装python-devel插件。这个插件包含有C/C++程序调用Python的头文件和库文件。在编写和编译程序的时候会用到。安装的话。直接在终端输入命令“yum install -y python-devel”即可。默认情况下安装的是Python2。需要安装Python3.x的话。运行命令“yum install -y python3x-devel”即可:
02C/C++程序调用Python
插件安装完成后。我们就可以直接编写C/C++程序来调用Python了。测试代码如下。这里我简单输出了一条Python语句。基本思想先初始化。然后调用Python。最后再结束。整个流程非常简单。也非常容易理解:
编写完成后。wq保存程序。接着在终端运行“gcc -lpython2.7 test.c -o test”命令(这里替换成你的C/C++文件)。即可正常编译程序。运行效果如下。和预期的一样:
当然。你也可以直接调用py文件(脚本)。传入参数。取得返回结果。这里我简单编写了一个add求和函数。输入2个参数。返回一个结果:
C/C++调用代码如下。基本流程和前面一样。先初始化。然后加载模块。调用函数。传入参数。最后再取得执行结果。代码量有些多。但理解起来不难:
至此。我们就完成了在C/C++程序中调用Python。总的来说。整个过程非常简单。只要你有一定C/C++基础。熟悉一下上面的示例和代码。很快就能掌握的。Windows环境类似。也需要导入对应头文件和库。网上也有相关教程和资料。介绍的非常详细。感兴趣的话。可以搜一下。希望以上分享的内容能对你有所帮助吧。也欢迎大家评论、留言进行补充。
其他观点:
如果你想把Python嵌入C C++中是比较简单的事情。你需要的是在VC中添加Python的include文件目录和lib文件目录。下面我们来看下如何把Python
如果你想把Python嵌入C/C++中是比较简单的事情。你需要的是在VC中添加Python的include文件目录和lib文件目录。下面我们来看下如何把Python嵌入C/C++中。
VC6.0下。打开 tools->options->directories->show directories for。将Python安装目录下的inlude目录添加到inlude files项中。将libs目录添加到library files项中。
VC2005下。打开tools->options->项目和解决方案->VC++目录。然后做相同工作。
代码如下:
在debug下执行出错。“无法找到python31_d.lib文件”。后查到原因是:在debug下生成必须要有python31_d.lib文件。否则只能在release下生成
#include <python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString(\"Print 'hi, python!'\");
Py_Finalize();
return 0;
}
Py_Initialize函数原型是:void Py_Initialize()
把Python嵌入C/C++中时必须使用该函数。它初始化Python解释器。在使用其他的Python/C API之前必须先调用该函数。可以使用Py_IsInitialized函数判断是否初始化成功。成功返回True。
PyRun_SimpleString函数原型是int PyRun_SimpleString(const char *command)。用来执行一段Python代码。
注意:是否需要维持语句间的缩进呢?
Py_Finalize函数原型是void Py_Finalize()。用于关闭Python解释器。释放解释器所占用的资源。
PyRun_SimpleFile函数可以用来运行\".py\"脚本文件。函数原型如下:
int PyRun_SimpleFile(FILE *fp, const char *filename);
其 中fp是打开的文件指针。filename是要运行的python脚本文件名。但是由于该函数官方发布的是由visual studio http://2003.NET编译的。如果使用其他版本的编译器。FILE定义可能由于版本原因导致崩溃。同时。为简便起见可以使用如下方式来代替该函数:
PyRun_SimpleString(\"execfile(‘file.py’)\"); //使用execfile来运行python文件
Py_BuildValue()用于对数字和字符串进行转换处理。变成Python中相应的数据类型(在C语言中。所有Python类型都被声明为PyObject类型)。函数原型如下:
PyObject *Py_BuildValue(const char *format, …..);
PyString_String()用于将PyObject*类型的变量转换成C语言可以处理的char*型。具体原型如下:
char* PyString_String(PyObject *p);
其他观点:
如果要在Python中包装现有的C或C ++功能。则有很多选择可以去做。一个比较简单的是。我们可以试着手动封装尝试下如何用Python嵌入C/C++进行开发。
手动封装
如果您要包装的C / C ++代码相对较少。则可以手动完成。文档的“ 扩展和嵌入”部分是一个很好的参考。
当我为C和C ++代码编写包装器时。通常会为代码提供一个过程接口。然后使用Python构造一个面向对象的接口。我这样做是出于两个原因:首先。将C ++对象暴露给Python很麻烦;其次。我更喜欢用Python编写高层结构。而不是用C ++编写它们。
让我们看一个基本的包装器:文件“ hello.c”中有一个函数“ hello”。“ hello”的定义如下:
char * hello(char * what)
要手动封装。我们需要执行以下操作。
首先。编写一个Python可调用函数。该函数接受一个字符串并返回一个字符串。
第三。为模块编写一个初始化函数(所有扩展模块都需要一个初始化函数)。
第四。编写一个setup.py脚本:
即使在此简单级别上。此代码也有两个方面值得讨论。
错误处理
请注意PyArg_ParseTuple调用。该调用告诉Python。“ hello”包装函数恰好采用一个参数。即字符串(“ s”表示“字符串”;“ ss”表示“两个字符串”;“ si”表示“字符串和整数”)) 。C API与Python的约定是。从返回PyObject *的函数返回NULL表示已发生错误;在这种情况下。错误信息是在PyArg_ParseTuple中设置的。我们只是通过返回NULL在堆栈上传递错误。
引用计数
Python在引用计数系统上工作:每当一个函数“拥有”一个对象的所有权(例如。通过将其分配给列表或字典)。它都会使用Py_INCREF使该对象的引用计数增加1。当将该对象从该特定位置删除(例如。从列表或字典中删除)时。引用计数将使用Py_DECREF减少。当引用计数达到0时。Python会知道该对象未被任何对象使用。并且可以释放该对象(但是。可能不会立即释放它)。
为什么这么重要?好吧。我们正在用PyString_FromString在此代码中创建一个PyObject。我们需要INCREF吗?要找出答案。请查看PyString_FromString的文档:
http://docs.python.org/api/stringObjects.html#l2h-461
看到哪里写着“新参考”?这意味着它将交出引用计数为1的对象。这就是我们想要的。如果它说“借用的引用”。那么我们需要在返回对象之前先对对象进行INCREF。以表明我们希望分配的内存能够在函数结束后继续存在。
这是一种考虑引用的方法:
如果您从Python API收到Python对象。则可以在自己的C代码中使用它。而无需增加它的引用。
如果您想保证Python对象可以在您自己的C代码末尾保留下来。则必须INCREF。
如果您从Python代码收到一个对象。并且它是一个新引用。但是您不希望它在您自己的C代码末尾生存下来。则应该对它进行DECREF。
顺便说一句。如果您想返回None。则可以使用Py_None。记住要INCREF!
另一个注意事项:我谈到了使用PyCObjects传递不透明的C / C ++数据类型。如果您使用Python来组织代码。但是这具有不需要访问Python的复杂结构。则这很有用。
您可以将指针包装在PyCObjects中(如果需要。可以使用关联的析构函数)。此时它们变为不透明的Python对象。其内存由Python解释器管理
。可以在示例代码看到一个例子。下 code/hello/hellmodule.c。函数cobj_in。cobj_out以及 free_my_struct。它通过使用PyCObject包装的分配的C结构回到Python。
总结
因此。这是关于如何手动封装Python的简短介绍。但是。您可能会猜到。有许多项目专门用于自动封装代码。所以手动封装尝试下用Python嵌入C/C++进行开发。其他的大家可以搜索看看。比较好用的是SWIG、pyrex和ctypes的等。
您还感兴趣的文章推荐- 准备与好友合伙做生意,开什么店合适?
- 想开个店,开什么好呢?资金不多,刚刚创业。谢谢?
- 有什么行业适用于初创业?
- 刚入社会的人想开店,最好开一家什么店?
- 我是一个创业小白,想要开一家店铺,大家有什么好的推荐吗?
以上就是由互联网推广工程师 网创网 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.wangchuang8.com/291897.html,转载请说明来源于:网创推广网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系进行处理。分享目的仅供大家学习与参考,不代表本站立场。
评论(2)
函数,代码,对象,文件,简单,字符串,原型,初始化,是在,自己的
没想到大家都对Python如何嵌入C/C++进行开发?感兴趣,不过这这篇解答确实也是太好了
你说的是在C/C++程序中调用Python吧。这个实现起来非常简单。只需要在头文件中引入Python.h文件。然后在编译