//file:py.h

BOOL InitPython();

BOOL ClosePython();

========================

//file:py.cpp

#include "stdafx.h"

#include "py.h"

#define MS_NO_COREDLL

//or user this

//#define Py_NO_ENABLE_SHARED

#include "python.h"

#pragma comment(lib, "python27.lib")

BOOL InitPython()

{

Py_Initialize();

if(!Py_IsInitialized())

{

AfxMessageBox("Python Initialize failed.\n");

return FALSE;

}

PyObject * pModule = NULL;

PyObject * pFunc = NULL;

pModule = PyImport_ImportModule("google");    //调用的文件名

pFunc= PyObject_GetAttrString(pModule, "main");    //调用的函数名

PyObject *arg;

arg = Py_BuildValue("(s)", "look");    //构造参数,关键字为“look”

PyEval_CallObject(pFunc, arg);    //调用函数

return TRUE;

}

BOOL ClosePython()

{

Py_Finalize();

return TRUE;

}

/*

1.相应的include和lib路径加入附加库:Python/include,Python/libs"加入附加库路径

2.然后在调用python的cpp头中加入#include "python.h"

2.调用Py_Initialize初始化python解析器环境

3.在c中,python所有对象都是PyObject,常用PyObject *

4.要把python中的数据类型转化成C中的数据类型,才能在C中使用

同样,返回给python的数据结构也要转成PyObject才能在python中使用(一般返回PyObject*)

5.使用Py_IsInitialized判断python解析器环境是否初始化成功

6.用PyRun_SimpleString执行python命令行,如:

PyRun_SimpleString("import sys")

返回0表示执行成功

7.PyObject pObj = PyInitModel("test2",NoticeFunc)等于把NoticeFunc对应的"函数映射数组"映射到python的test2模块中,返回模块地址

为NULL表示映射失败

NoticeFunc定义为一个结构体数组:

PyMethodDef  NoticeFunc[] =   {    {"MaxP",MaxC,METH_VARARGS,"Maxof two args"},    .......   }

其中MaxP是python中函数名,MaxC是c中回调函数名(实际调用的是它)。

METH_VARARGS是参数传递方式,表示通过元组传递参数,METH_KEYWORD表示通过字典传递参数

映射成功后,我们用:

PyRun_SimpleString("import test2");

PyRun_SimpleString("print test2.MaxP(1,3)");

可以执行MaxP函数,表示test2已经植入解析器中

8.Py_BuildValue("i",2003)把2003转化成python中的数据类型,返回一个PyObject*

可用PyInt_Check检查它是否已经转化成了Python中的int

9.C中每产生一个PyObject,此对象的引数就加1,此对象的引数为0时,解析器会释放内存

可用Py_DECREF()将一个对象的引数减一

如果一个Python对象是返回到Python解析器里去,就不要调用Py_DECREF了

如果是Python返回给C使用,则用完后要用此宏自减引用数

10.返回Py_None时要先自加一次:

Py_INCREF(Py_None);

return Py_None;

如果不自加,解析器对Py_None对象的引数为0(实际是1),则Py_None返回给Python解析器后用完不会释放。

11.用PyArg_ParseTuple(argvs,"ii",&a,&b)把pyton的元组解析成两个整数。

12. 清除Python解析环境Py_Finalize();

*/

VC 调用 Python的更多相关文章

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

    序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...

  2. Python语言学习之C++调用python

    C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进 ...

  3. VS调用python方法

    1.  安装python3.7 2.  Vs2010中配置python: 3.添加头文件:#include <Python.h> 4.问题:error LNK2001: 无法解析的外部符号 ...

  4. cpp 调用python

    在用cpp调用python时, 出现致命错误: no module named site  ,  原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...

  5. c调用python

    #include <Python.h>//python33(python2.x有几个函数不对应) /* PyImport_ImportModule 导入一个Python模块并返回它的指针 ...

  6. linux+php+apache web调用python脚本权限问题解决方案

    lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...

  7. linux+php+apache web调用python脚本权限问题

    lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...

  8. C#中调用python方法

    最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...

  9. PHP 调用Python脚本

    上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apac ...

随机推荐

  1. python面向对象(四)之抽象类与接口

    ​ 学过java的应该知道java有抽象类和接口的那么python呢?(以前写的关于java抽象类的笔记java抽象类与接口) python作为一个动态语言,没有强类型的检查,而是以鸭子类型的方式提现 ...

  2. docker使用Dockerfile构建ssh容器

    一.使用Dockerfile构建centos 1.创建 Dockerfile mkdir centos # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd centos # 进入目录 ...

  3. js对象的属性:数据(data)属性和访问器(accessor)属性

    此文为转载,原文: 深入理解对象的数据属性与访问器属性 创建对象的方式有两种:第一种,通过new操作符后面跟Object构造函数,第二种,对象字面量方式.如下 var person = new Obj ...

  4. .net/c#常用框架/中间件简介

    任务调度 Quartz.NET:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允 许开发人员根据时间间隔 ...

  5. Java开发工程师学习路线

    贴一个比较出名的Java开发工程师学习路线图 好好学习提升中 这个貌似也不是特别全,算法,设计模式,架构好像都没有

  6. js和php计算图片自适应宽高算法实现

    js Code: <script> $width = $(imgobj).width(); //图原始宽 $newheight = $(imgobj).height(); //图原始高 $ ...

  7. echart 打开新世界的大门

    实时折线图 option = { backgroundColor:'#2B2B2B', tooltip: { trigger: 'axis' }, legend: { data:['频率'], tex ...

  8. bzoj [SDOI2009]学校食堂Dining

    感觉这个状压dp比较难想.. dp[ i ][ s ][ k ] 表示前i - 1个都排好了, 从i开始的7个的取没取的状态为s, 且最后一个相对i的位置为k的最少花费. 状态转移方程 if(s &a ...

  9. 7-15 Square Destroyer 破坏正方形 uva1603

    先是处理所有的正方形 从边长为1开始 将其边存好 满边存好 然后不断扫描正方形  并且进行拆除  直到拆完或者 步数小于等于9(启发方程  因为n小于等于5  九次足以将所有的拆完) 代码实施有很多细 ...

  10. 006 ajax验证用户名

    1.大纲 2.index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...