Win7,64位,C++调用Python

20 篇文章 0 订阅

系统:Win7,64位

Python:3.5,64位


1、新建一个控制台程序CallPy

2、配置头文件路径、lib库路径、lib库。





3、C++代码

// CallPy.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>		//使用标准流
#include "Python.h"

using namespace std;	//导入std名字空间

void HelloWorld();  
void Add();  
void TestTransferDict();  
void TestClass();  

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "Starting Test..." << endl;  

	cout << "HelloWorld()-------------" << endl;  
	HelloWorld();
	cout << "Add()--------------------" << endl;  
	Add();
	cout << "TestDict-----------------" << endl;  
	TestTransferDict();
	cout << "TestClass----------------" << endl;  
	TestClass();  

	system("pause");  

	return 0;
}

//调用输出"Hello World"函数  
void HelloWorld()  
{  
	Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化 

	PyObject * pModule	= NULL;//声明变量  
	PyObject * pFunc	= NULL;//声明变量  
	pModule = PyImport_ImportModule("Test001");	//这里是要调用的Python文件名  
	pFunc	= PyObject_GetAttrString(pModule, "HelloWorld");//这里是要调用的函数名
	PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空 

	Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的.  
}

//调用Add函数,传两个int型参数  
void Add()  
{  
	Py_Initialize();  

	PyObject * pModule	= NULL;  
	PyObject * pFunc	= NULL;
	pModule = PyImport_ImportModule("Test001");//Test001:Python文件名  
	pFunc	= PyObject_GetAttrString(pModule,"add");//Add:Python文件中的函数名    
	//创建参数
	PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数  
	PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号i表示创建int型变量  
	PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号//返回值
	PyObject *pReturn = NULL;  
	pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
	//将返回值转换为int类型  
	int result;  
	PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量  
	cout << "5+7 = " << result << endl;  

	Py_Finalize();  
} 

//参数传递的类型为字典  
void TestTransferDict()  
{  
	Py_Initialize();  

	PyObject * pModule	= NULL;  
	PyObject * pFunc	= NULL;  
	pModule = PyImport_ImportModule("Test001");//Test001:Python文件名  
	pFunc	= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名
	//创建参数:  
	PyObject *pArgs = PyTuple_New(1);   
	PyObject *pDict = PyDict_New(); //创建字典类型变量  
	PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao"));	//往字典类型变量中填充数据  
	PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25));	//往字典类型变量中填充数据  
	PyTuple_SetItem(pArgs, 0, pDict);	//0---序号将字典类型变量添加到参数元组中
	//返回值  
	PyObject *pReturn = NULL;  
	pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数
	//处理返回值:  
	int size = PyDict_Size(pReturn);  
	cout << "返回字典的大小为: " << size << endl;  
	PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age");  
	int newAge;  
	PyArg_Parse(pNewAge, "i", &newAge);  
	cout << "True Age: " << newAge << endl;  

	Py_Finalize();  
}

//测试类  
void TestClass()  
{  
	Py_Initialize();  

	PyObject * pModule = NULL;  
	PyObject * pFunc = NULL;  
	pModule = PyImport_ImportModule("Test001");//Test001:Python文件名  
	pFunc	= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名
	//获取Person类  
	PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person");
	//创建Person类的实例
	//PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);//Python2.7有该接口,Python3.5没有该接口。
	PyObject *pInstancePerson = PyInstanceMethod_New(pClassPerson);
	//调用方法  
	PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty"  

	Py_Finalize();  
}


4、Python代码

#Test001.py    
def HelloWorld():    
    print ("Hello World")    
def add(a, b):    
    return a+b    
def TestDict(dict):    
    print (dict)    
    dict["Age"] = 17    
    return dict    
class Person:    
    def greet(self, greetStr):    
        print (greetStr)    
#print add(5,7)    
#a = raw_input("Enter To Continue...")


5、运行结果

注意:

PyInstance_New();//Python2.7有该接口,Python3.5没有该接口。

测试类的结果没有输出。



参考:

http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html


另:

PyObject *pName,*pModule;
// 载入名为Test001的脚本
//pName = PyString_FromString("Test001");

//hint:"can't find Test001.py"
//pName = PyBytes_FromString("Test001");
//pModule = PyImport_Import(pName);

pModule = PyImport_ImportModule("Test001");//这里是要调用的Python文件名


Python3.5中,不使用PyString_FromString(),使用PyBytes_FromString()。

而且,使用PyImport_ImportModule()才能成功。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值