1. 程式人生 > >C++中嵌入Python的環境搭建

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

1、包含python環境:

注意:python36.lib去路徑下copy一份命名為python36_d.lib,在下面載入上去,此處沒改。

 

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 <iostream>
#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位機會出現如下錯誤:

解決方法是將編譯平臺修改為:X64