C++中嵌入Python的环境搭建

1、包含python环境:

注意:python36.lib去路径下copy一份命名为python36_d.lib,在下面加载上去,此处没改。

C++中嵌入Python的环境搭建_第1张图片

C++中嵌入Python的环境搭建_第2张图片

 

2、编写CppPython.py

def add(a,b):  
    print ("in python function add")
    print ("a = " + str(a))
    print ("b = " + str(b))
    print ("ret = " + str(a+b))
    return  
  
def foo(a):  
  
    print ("in python function foo")
    print ("a = " + str(a))
    print ("ret = " + str(a * a))
    return 

3、在这个过程中有一个错误,缺少:inttypes.h

可以下载了放在这里:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include

//C++代码:
#include 
#include "Python.h"

using namespace std;

int main(int argc, char** argv)
{
	// 初始化Python
	//在使用Python系统前,必须使用Py_Initialize对其
	//进行初始化。它会载入Python的内建模块并添加系统路
	//径到模块搜索路径中。这个函数没有返回值,检查系统
	//是否初始化成功需要使用Py_IsInitialized。

	Py_Initialize();

	// 检查初始化是否成功
	if ( !Py_IsInitialized() ) 
	{
		return -1;
	}

	// 添加当前路径
	//把输入的字符串作为Python代码直接运行,返回0
	//表示成功,-1表示有错。大多时候错误都是因为字符串
	//中有语法错误。
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	PyObject *pModule,*pDict,*pFunc,*pArgs;//*pName,

	// 载入名为CppPython的脚本
	//pName = PyString_FromString("CppPython");

	char* message = "CppPython";
	PyObject * bytesObject = PyByteArray_FromStringAndSize(message, strlen(message));
	PyObject * buildObject = Py_BuildValue("y#", message, strlen(message));
	PyObject * argsObject = PyTuple_New(1);
	PyTuple_SetItem(argsObject, 0, bytesObject);

	pModule = PyImport_Import(argsObject);
	if ( !pModule )
	{
		printf("can't find CppPython.py");
		getchar();
		return -1;
	}
	pDict = PyModule_GetDict(pModule);
	if ( !pDict ) 
	{
		return -1;
	}

	// 找出函数名为add的函数
	pFunc = PyDict_GetItemString(pDict, "add");
	//pFunc = PyObject_GetAttrString(pModule, "add");
	if ( !pFunc || !PyCallable_Check(pFunc) )
	{
		printf("can't find function [add]");
		getchar();
		return -1;
	}

	// 参数进栈
	pArgs = PyTuple_New(2);

	//  PyObject* Py_BuildValue(char *format, ...)
	//  把C++的变量转换成一个Python对象。当需要从
	//  C++传递变量到Python时,就会使用这个函数。此函数
	//  有点类似C的printf,但格式不同。常用的格式有
	//  s 表示字符串,
	//  i 表示整型变量,
	//  f 表示浮点数,
	//  O 表示一个Python对象。

	PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); 
	PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));

	// 调用Python函数
	PyObject_CallObject(pFunc, pArgs);

	//下面这段是查找函数foo 并执行foo
	pFunc = PyDict_GetItemString(pDict, "foo");
	if ( !pFunc || !PyCallable_Check(pFunc) )
	{
		printf("can't find function [foo]");
		getchar();
		return -1;
	}

	pArgs = PyTuple_New(1);
	PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2)); //

	PyObject_CallObject(pFunc, pArgs);


	//Py_DECREF(pName);
	Py_DECREF(pArgs);
	Py_DECREF(pModule);

	// 关闭Python
	Py_Finalize();
	return 0;
}

64位机会出现如下错误:

C++中嵌入Python的环境搭建_第3张图片

解决方法是将编译平台修改为:X64

提示python36.dll找不到:

我就把python36.dll从安装文件路径下面扔到了C:\Windows\System32路径下。

你可能感兴趣的