天天看點

C++ 調用Python腳本

本人環境:

Windows10;

python3.7.4;

visual studio 2019;

安裝python,opencv(如果用到的話),以及将二者目錄添加到vs中的包含目錄和庫目錄就不再說了。教程一大堆,自己配置好。以下步驟都建立在這些環境配置成功之後。

重要:

将Python安裝目錄下的

include

libs

檔案夾引入到項目中

libs

目錄下的

python37.lib

複制一份為

python37_d.lib

一、

Python

腳本

這個python腳本和C++編譯成功後生成的.exe檔案放在同一目錄下。

def Hello():
    print("Hello")
    
def Add(a,b):
    return  a+b      

二、C++調用python腳本

#include <Python.h>
using namespace std;

int main()
{
	Py_Initialize();              //初始化,建立一個Python虛拟環境
	if (Py_IsInitialized())
	{
		PyObject* pModule = NULL;
		PyObject* pFunc = NULL;
		pModule = PyImport_ImportModule("test_python");  //參數為Python腳本的檔案名
		if (pModule)
		{
			pFunc = PyObject_GetAttrString(pModule, "Hello");   //擷取函數
			PyEval_CallObject(pFunc, NULL);           //執行函數
		}
		else
		{
			printf("導入Python子產品失敗...\n");
		}
	}
	else
	{
		printf("Python環境初始化失敗...\n");
	}
	Py_Finalize();
}
      

需要将

Python

安裝目錄下的

Lib

Dlls

放到程式運作目錄下,并添加

Python37.dll

到運作目錄即可(我是這麼做的)。

運作結果:

C++ 調用Python腳本

ok,成功調用python腳本。

#include<Python.h> //添加python的聲明

using namespace std;

int main()
{
Py_Initialize(); //1、初始化python接口

//初始化使用的變量
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pName = NULL;

//2、初始化python系統檔案路徑,保證可以通路到 .py檔案
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

//3、調用python檔案名。目前的測試python檔案名是test.py。在使用這個函數的時候,隻需要寫檔案的名稱就可以了。不用寫字尾。
pModule = PyImport_ImportModule("test");

//4、調用函數
pFunc = PyObject_GetAttrString(pModule, "AdditionFc");

//5、給python傳參數
PyObject* pArgs = PyTuple_New(2);//函數調用的參數傳遞均是以元組的形式打包的,2表示參數個數。如果AdditionFc中隻有一個參數時,寫1就可以了。這裡隻先介紹函數必須有參數存在的情況。


PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2)); //0:表示序号。第一個參數。
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4)); //1:也表示序号。第二個參數。i:表示傳入的參數類型是int類型。

//6、使用C++的python接口調用該函數
PyObject* pReturn = PyEval_CallObject(pFunc, pArgs);

//7、接收python計算好的傳回值
int nResult;
PyArg_Parse(pReturn, "i", &nResult);//i表示轉換成int型變量。在這裡,最需要注意的是:PyArg_Parse的最後一個參數,必須加上“&”符号。

//8、結束python接口初始化
Py_Finalize();
}
      

繼續閱讀