本人環境:
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
到運作目錄即可(我是這麼做的)。
運作結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SYxUzYkNmZ2QWO1MjMlJGNwI2YyMTZ4ETZyYTN1QWY08CX0IzLcVDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
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();
}