c/c++中嵌入python

在c/c++中嵌入python也比较简单,首先需要在vc中添加python的include文件目录和lib文件目录: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
int main()
{
py_initialize();
pyrun_simplestring(“print ‘hi, python!'”);
py_finalize();
return 0;
}

py_initialize函数原型是:void
py_initialize(),在嵌入python脚本时必须使用该函数,它初始化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
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);

列表操作函数:pyobject
* pylist_new(py_ssize_t len);int pylist_setitem(pyobject *list, py_ssize_t
index, pyobject *item);pyobject * pylist_getitem(pyobject *list, py_ssize_t
index);int pylist_append(pyobject *list, pyobject *item);int
pylist_sort(pyobject *list);int pylist_reverse(pyobject
*list);py_ssize_t pylist_size(pyobject *list);

元组操作函数:int
pytuple_new(py_ssize_t len);int pytuple_setitem(pyobject *p, py_ssize_t pos,
pyobject *o);pyobject * pytuple_getitem(pyobject *p, py_ssize_t pos);int
_pytuple_resize(pyobject **p, py_ssize_t newsize);
//注意是**指针

字典操作函数:pyobject * pydict_new();int pydict_setitem(pyobject
*p, pyobject *key, pyobject *val);int pydict_setitemstring(pyobject *p,
const char *key, pyobject *val);pyobject* pydict_getitem(pyobject *p,
pyobject *key);pyobject* pydict_getitemstring(pyobject *p, const char
*key); //与pydict_setitemstring对应int pydict_delitem(pyobject *p, pyobject
*key);int pydict_delitemstring(pyobject *p, char
*key);//与pydict_setitemstring对应int pydict_next(pyobject *p, py_ssize_t
*ppos, pyobject **pkey, pyobject **pvalue);pyobject* pydict_items(pyobject
*p);pyobject* pydict_keys(pyobject *p);pyobject* pydict_values(pyobject
*p);在c/c++中使用python对象应正确地处理引用计数问题,否则容易导致内存泄漏。当使用python/c
api中的函数创建列表、元组、字典等后,在对其完成操作后应该使用py_clear()和py_decref()等宏来销毁这些对象。原型如下:void
py_clear(pyobject *o);void py_decref(pyobject
*o);其中,对于py_clear函数,参数可以为null指针,表示不进行任何操作,但是py_decref函数不能为null指针,否则导致错误。使用pyimport_import()函数可以在c中导入python模块,返回一个模块对象。函数原型为:pyobject*
pyimport_import(pyobject
*name);pymodule_getdict()函数可以获得python模块中的函数列表,返回一个字典,字典中的关键字为函数名,值为函数的调用地址。原型如下:pyobject*
pymodule_getdict(pyobject
*module);使用pyobject_callobject()函数和pyobject_callfunction()函数可以在c中调用python中的函数,原型如下:pyobject*
pyobject_callobject(pyobject *callable_object, pyobject
*args);//args是元组形式pyobject* pyobject_callfunction(pyobject *callable,
char *format,
……);//format是类似”iss”这样的参数类型,后面是指定参数可以使用pycallable_check(func)来判断是否可以调用函数,可以则返回true。

以上就是c/c++中嵌入python的内容,更多相关文章请关注php中文网(www.php1.cn)!

Posted in 未分类

发表评论