C++中嵌入Python

c++调用python的流程如下:

1:includt<boost/python.cpp>      ;注意不用导入<python.h>文件

2:初始化python解释器: Py_Initialize()

3 :  调用别的Python/C API做一些环境的初始化操作。比如把python的全局锁,到脚本加入到解释器的include路径下。

  1. PyRun_SimpleString("import sys");
    PyRun_SimpleString((std::string("if not ‘")+ m_scriptPath
    +"‘ in sys.path: sys.path.append(‘"+ m_scriptPath +"‘)").c_str());

Boost.python提供了3中运行python代码的方法;

object eval(str expression, object globals = object(), object locals = object())
object exec(str code, object globals = object(), object locals = object())
object exec_file(str filename, object globals = object(), object locals = object())

eval 执行表达式,exec执行语句,exec_file执行文件。 globals和locals变量是dict对象包含了代码运行的全局和本地环境

  1. object main_module =import("__main__");
    object main_namespace = main_module.attr("__dict__");
    object ignored = exec("result = 5 ** 2", main_namespace);
    int five_squared = extract<int>(main_namespace["result"]);

4:导入module:

python::import(std::string name)  相当python的import语句

6: tuple的用法

object[0]

7:dict的用法

dict["name"]

8:str的用法

  1. object main_module =import("__main__");
    object main_namespace = main_module.attr("__dict__");
    object ignored = exec("result = (3,4,6)", main_namespace);
    string str=python::extract<string>(python::str(main_namespace["result"][0]).encode("utf-8"));
    cout<<"result"<<str<<endl;

异常处理

  1. catch(...)
    {
    PyErr_Print();
    PyErr_Clear();
    PD_RC_CHECK( DBAAS_SYS_ERR, PDERROR,
    "Failed to delete vm, python error detected!");
    }

其实object还有很多方法,同时python的buildin函数在boost.python也有对象的方法 比如len

下面是一个对象调用的例子:

  1. try
    {
    PythonExecThrLock _pyLock ;
    PyRun_SimpleString("import sys");
    PyRun_SimpleString((std::string("if not ‘")+ m_scriptPath
    +"‘ in sys.path: sys.path.append(‘"+ m_scriptPath +"‘)").c_str());
    python::object module = python::import("ModuleName");
    python::object global( module.attr("__dict__"));
    m_instService = global["ClassName"];
    python::object instService=m_instService();//调用构造函数,如果构造函数有参数,请传入。
    python::object createInstance=instService.attr("createInstance");//获取对象的方法
    ret = createInstance(int类型,std::string类型);//调用方法,返回一个object对象,如果要获取返回值需要对ret解析。使用extract
    std::string strRet=python::extract<std::string>(str(result).encode("utf-8"))
    }
    catch(...)
    {
    PythonExecThrLock _pyLock ;
    PyErr_Print();
    PyErr_Clear();
    PD_RC_CHECK( DBAAS_SYS_ERR, PDERROR,
    "Failed to init aliCloudVmProvider, python error detected!");
    }
时间: 2024-11-06 11:55:29

C++中嵌入Python的相关文章

VS2010中嵌入Python的方法

1,.安装vs2010. 2.下载Python,安装.Python下载地址. 3.下载Python tools for visual studio的工具,地址.下载的时候要选择适合vs版本的工具.安装工具的时候如果提示需要安装一个插件,按照提示安装即可.

嵌入Python | 调用Python模块中有参数的函数

开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调用无参数的函数>中我们成功的在C++主程序中嵌入了Python,并且调用了Python模块中的一个无参数的函数.这一篇我们将在此基础上,实现在主程序中调用Python模块中有参数的函数,使两者互动起来. 0 准备say_hi.py模块 在say_hi.py中增加含有一个参数的函数prt_hello和含有

python tkinter中嵌入gif图片(动态图片)

# -*- coding: cp936 -*- #python 27 #xiaodeng #在tkinter中嵌入gif图片(动态图片) from Tkinter import * def main(): filename = 'test.gif' root = Tk() img = PhotoImage(file=filename) label = Label(root, image=img) label.pack() root.mainloop() main()

在C语言中如何嵌入python脚本

最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌入python脚本. 上网查一下,发现确实有办法做到,下面亲测有效: #include <Python.h> #include <stdio.h> int main() { Py_Initialize(); PyRun_SimpleString("print 'Hello P

freeswitch嵌入python脚本

操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 python版本:2.7.9 开启python模块 安装python lib库 apt-get install python-dev 编辑modules.conf,开启python模块: languages/mod_python 编译安装: ./configure && make && make install 在modules.conf.xml中开启python支持: 启动freeswitc

【转】windows和linux中搭建python集成开发环境IDE

http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件Ubuntu / windowsPython 2.7 / python 3Pycharm 2.6.3Openjdk Postgresql 9.1VirtualenvVirtualenvwrapper{开始之前,可以给系统做一下备份.如误安装了Postgresql,出现了大问题就不得不把系统给重装了} 安装python 安装python 1. Ubuntu 12.04系统

WPF中嵌入普通Win32程序的方法

公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系统中来,让使用者看起来它们好像是一个程序. 在MSDN中有专门的章节提到了在WPF中嵌入Win32控件的办法,那就是使用 HwndHost ,只要把 Win32控件的句柄传递给 HwndHost 就可以了.MSDN中的例子演示的都是在同一个进程内创建的 Win32控件,我一开始认为只要通过FindW

工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)

序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中根据需求会拆分的更细.外部的表现形式就是一个核心动态库,带着一堆业务业务动态库.通过一个调度程序把这些链接起来,外加一堆配置文件,就形成一个完成的项目. 这种模式在一个团队开发中,工作职责比较容易划分.制定API接口后,开发工作基本可以并行实现,包括后期的功能测试(白盒.黑盒).不管工程使用什么语言

在Web页中嵌入QT对象

根据最近读的QT高级编程,原来QT是可以在HTML中嵌入对象的,确实很厉害.于是自己动手写了一个Demo,中途出现了一点点问题,js执行有问题,看来要提交javascript了,我感觉python也应该适当提高提高了.下面要重点提一下我犯的错误. <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 8.0"> <TITLE><