VS2022+Python3.11實(shí)現(xiàn)C++調(diào)用python接口
查了一些資料,不是報(bào)這個(gè)錯(cuò),就是報(bào)哪個(gè)錯(cuò),沒有找到和我安裝的環(huán)境的一致的案例,于是將自己的摸索分享出來(lái)。
一、環(huán)境準(zhǔn)備
1、Visual Studio 2022,下載地址:https://visualstudio.microsoft.com/zh-hans/downloads/
2、Python版本是3.11,下載地址:https://www.python.org/downloads/
3、安裝Visual Studio 2022和Python3.11
安裝過程簡(jiǎn)單,此處不再贅述,我們的重點(diǎn)是看如何實(shí)現(xiàn)接口調(diào)用的。
二、配置Visual Studio 2022
安裝好環(huán)境后,使用Visual Studio 2022創(chuàng)建一個(gè)新項(xiàng)目,我這里取名c++python。需要配置3個(gè)地方:
1、右擊項(xiàng)目名稱-->屬性,選擇VC++目錄,根據(jù)python安裝路徑,配置包含目錄和庫(kù)目錄。python安裝路徑怎么查看?打開cmd,輸入python回車,使用如下兩個(gè)命令即可看到python路徑。
>>> import sys >>> sys.path
將python安裝路徑下的include文件夾和libs文件夾復(fù)制到剛才新建的項(xiàng)目c++python目錄下,配置如圖所示:
2、右擊項(xiàng)目名稱-->屬性,選擇C/C++下的常規(guī),配置附加包含目錄,加上項(xiàng)目中include的路徑,如圖所示:
3、右擊項(xiàng)目名稱-->屬性,選擇鏈接器下的輸入,配置附加依賴項(xiàng),將項(xiàng)目中的libs目錄中python311.lib復(fù)制一份,改名為python311_d.lib,附加依賴項(xiàng)的內(nèi)容填寫C:\Users\source\repos\c++python\libs\python311_d.lib;如圖所示:
三、編寫python代碼和C++代碼
1. 首先,創(chuàng)建一個(gè)名為test_python.py的Python文件,內(nèi)容如下:
def add(a, b): return a + b
2. 然后,創(chuàng)建一個(gè)名為main.cpp的C++文件,內(nèi)容如下:
#include <iostream> #include <Python.h> int main() { /*初始化python*/ Py_Initialize(); /*初始化python系統(tǒng)文件路徑,否則加載不到要調(diào)用的test_python.py文件*/ PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); /*加載要調(diào)用的python文件名稱,當(dāng)前測(cè)試文件名稱:test_python.py*/ PyObject* pName = PyUnicode_DecodeFSDefault("test_python"); PyObject* pModule = PyImport_Import(pName); Py_XDECREF(pName); if (pModule != NULL) { /*加載python模塊中的函數(shù)*/ PyObject* pFunc = PyObject_GetAttrString(pModule, "add"); if (PyCallable_Check(pFunc)) { /*給pythonm模塊中的函數(shù)add傳遞2個(gè)參數(shù),以元組的形式傳遞*/ PyObject* pArgs = PyTuple_New(2); /*給add函數(shù)傳遞第一個(gè)參數(shù)6*/ PyTuple_SetItem(pArgs, 0, PyLong_FromLong(6)); /*給add函數(shù)傳遞第二個(gè)參數(shù)10*/ PyTuple_SetItem(pArgs, 1, PyLong_FromLong(10)); /*C++的python接口調(diào)用add函數(shù),返回計(jì)算結(jié)果*/ PyObject* pValue = PyObject_CallObject(pFunc, pArgs); Py_XDECREF(pArgs); if (pValue != NULL) { /*打印計(jì)算結(jié)果*/ std::cout << "\n " << std::endl; std::cout << "Result of call: " << PyLong_AsLong(pValue) << std::endl; std::cout << "\n " << std::endl; Py_XDECREF(pValue); } else { PyErr_Print(); } } else { if (PyErr_Occurred()) { PyErr_Print(); } fprintf(stderr, "Cannot find function \"add\""); } Py_XDECREF(pFunc); Py_XDECREF(pModule); } else { PyErr_Print(); fprintf(stderr, "Failed to load \"%s\"", "test"); return 1; } /*結(jié)束python初始化*/ Py_Finalize(); return 0; }
test_python.py和main.cpp在同一目錄,如圖所示:
3. 編譯
1>正在生成代碼
1>Previous IPDB not found, fall back to full compilation.
1>All 16 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
1>已完成代碼的生成
1>c++python.vcxproj -> C:\Users\source\repos\c++python\x64\Release\c++python.exe
========== “全部重新生成”: 1 成功,0 失敗,0已跳過 ==========
========== 占用時(shí)間 00:02.052 ==========
4. 點(diǎn)擊菜單"調(diào)試-->開始執(zhí)行(不調(diào)試)運(yùn)行,可以看到輸出結(jié)果:
到此這篇關(guān)于VS2022+Python3.11實(shí)現(xiàn)C++調(diào)用python接口的文章就介紹到這了,更多相關(guān)C++調(diào)用python接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?計(jì)算機(jī)視覺編程進(jìn)階之OpenCV?圖像銳化及邊緣檢測(cè)
計(jì)算機(jī)視覺這種技術(shù)可以將靜止圖像或視頻數(shù)據(jù)轉(zhuǎn)換為一種決策或新的表示。所有這樣的轉(zhuǎn)換都是為了完成某種特定的目的而進(jìn)行的,本篇我們來(lái)學(xué)習(xí)下如何對(duì)圖像進(jìn)行銳化處理以及如何進(jìn)行邊緣檢測(cè)2021-11-11如何用Pythony驗(yàn)證萬(wàn)物歸一(考拉咨猜想)
考拉咨猜想簡(jiǎn)單的來(lái)說(shuō),就是你隨便給我一個(gè)整數(shù),我最后都是會(huì)通過固定的規(guī)則演變成"1",萬(wàn)物歸一.今天我們就用那Python驗(yàn)證一下這個(gè)猜想2021-06-06python 定時(shí)器每天就執(zhí)行一次的實(shí)現(xiàn)代碼
這篇文章主要介紹了python 定時(shí)器每天就執(zhí)行一次的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法
今天小編就為大家分享一篇python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-12-12Python使用SQLAlchemy操作Mysql數(shù)據(jù)庫(kù)的操作示例
SQLAlchemy是Python的SQL工具包和對(duì)象關(guān)系映射(ORM)庫(kù),它提供了全套的企業(yè)級(jí)持久性模型,用于高效、靈活且優(yōu)雅地與關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互,這篇文章主要介紹了Python使用SQLAlchemy操作Mysql數(shù)據(jù)庫(kù),需要的朋友可以參考下2024-08-08