VC 调用 Python
//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的更多相关文章
- 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)
序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...
- Python语言学习之C++调用python
C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进 ...
- VS调用python方法
1. 安装python3.7 2. Vs2010中配置python: 3.添加头文件:#include <Python.h> 4.问题:error LNK2001: 无法解析的外部符号 ...
- cpp 调用python
在用cpp调用python时, 出现致命错误: no module named site , 原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...
- c调用python
#include <Python.h>//python33(python2.x有几个函数不对应) /* PyImport_ImportModule 导入一个Python模块并返回它的指针 ...
- linux+php+apache web调用python脚本权限问题解决方案
lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...
- linux+php+apache web调用python脚本权限问题
lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...
- C#中调用python方法
最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...
- PHP 调用Python脚本
上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apac ...
随机推荐
- MVC中检测到有潜在危险的 Request.Form 值
在做mvc项目时,当使用xhedit or.ueditor编辑器时,点击提交时,编辑器中的内容会带有html标签提交给服务器,这时就是会报错,出现如下内容: “/”应用程序中的服务器错误. 从客户端( ...
- ntpdate[35450]: the NTP socket is in use, exiting
当前主机已是NTP服务器,需关闭当前NTP服务,再同步其他NTP服务器的时间 service ntpd stop 然后ps -ef | grep ntp看进程是否已杀掉 然后再次ntpdate Ser ...
- TcxScheduler的使用
TcxScheduler有两种工作模式: 一.非绑定模式 非绑定模式下,数据被存储在文件系统中.要让scheduler工作在非绑定模式下,应使TcxScheduler.Storage属性绑定到TcxS ...
- Github授权新的设备ssh接入
为Mac生成公钥 步骤: 检查本机是否已有公钥 ls -la ~/.ssh 将原来的公钥删除 rm -rf ~/.ssh 生成新的公钥(填自己的邮箱),然后除了密码,一路默认 ssh-keygen - ...
- 玩玩 Nginx 1----- Nginx + ngx_lua安装测试【CentOs下】
最近打算搞搞nginx,扒着各位先驱的文章自己进行测试下,中间过程也是错误不断,记录一下,以备使用. nginx的安装挺简单的,主要还是研究下一些第三方的模块,首先想试下初始化 ...
- php 中更简洁的三元运算符 ?:
PHP 三元运算符是对参数赋值时候的一个简洁的主要用法. 一个主要的用法: PHP 三元运算符能够让你在一行代码中描述判定代码, 从而替换掉类似以下的代码: <?php if (isset($v ...
- Linux入门(二)Shell基本命令
上一篇讲了普通用户切换到root用户,今天补充一点,对于Debian和Ubuntu用户,安装时候只有一个普通用户注册,在需要root权限时,我们可以在普通用户模式下输入sudo这个命令运行某些相关特权 ...
- github后端开发面试题大集合(二)
作者:小海胆链接:https://www.nowcoder.com/discuss/3615?type=0&order=0&pos=8&page=0来源:牛客网 7.非关系型数 ...
- ROS二进制日志包 ROS binary logger package
原文网址: 1 http://www.ros.org/news/2017/02/ros-binary-logger-package.html 2 https://github.com/CNR-ITIA ...
- SQL数据是否存在(是否有数据)判断,表,存储过程是否存在
判断是否存在数据 if exists( select * from Hong_PageConfig where names='name' ) Begin print '1' End else Begi ...