最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何在VS2019和VScode中配置C++調(diào)用python接口

 更新時(shí)間:2020年12月23日 10:18:44   作者:wch_NUDT  
這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

why

看到這個(gè)標(biāo)題有些人說了,為什么好好的C++你非要調(diào)用python?人家明明是兩種語言呀!
但是在實(shí)際應(yīng)用中,有時(shí)候會(huì)用到C/C++調(diào)用python來更簡單地去完成一些功能,不然人家python為什么有一個(gè)文件夾叫include,里邊全是.h文件呢?

VScode中配置環(huán)境

首先是在VScode中為C++調(diào)用python接口配置環(huán)境,這里假設(shè)你已經(jīng)配置好了c++編程環(huán)境!

1、配置step1

用快捷鍵Ctrl+Shift+X打開Extensions 商店,輸入python,install:

在這里插入圖片描述

2、配置step2

用快捷鍵Ctrl+Shift+P打開命令面板,打開C/C++:編輯配置(UI):

在這里插入圖片描述

然后編輯c_cpp_properties.json文件,在文件中的includePath項(xiàng)添加自己的python include路徑:“D:\\Python\\Python37\\include”,注意格式。

{
 "configurations": [
  {
   "name": "Win32",
   "includePath": [
    "${workspaceFolder}/**",
    "D:\\Python\\Python37\\include"
   ],
   "defines": [
    "_DEBUG",
    "UNICODE",
    "_UNICODE"
   ],
   "compilerPath": "D:\\MinGW\\bin\\gcc.exe",
   "cStandard": "c11",
   "cppStandard": "c++17",
   "intelliSenseMode": "clang-x64"
  }
 ],
 "version": 4
}

3、測試

測試一下:編輯hello.py

def printHello():
 print("Hello World")

c++調(diào)用python有兩種方式,我在代碼中都進(jìn)行了測試,編輯main.cpp

#include "D:\Python\Python37\include\Python.h"
//#include <Python.h>
#include <iostream>
using namespace std;
void cython1()
{
 Py_Initialize();       //初始化python解釋器,告訴編譯器要用的python編譯器
 PyRun_SimpleString("import hello");  //調(diào)用python文件
 PyRun_SimpleString("hello.printHello()"); //調(diào)用上述文件中的函數(shù)
 Py_Finalize();       //結(jié)束python解釋器,釋放資源
}

void cython2()
{
 Py_Initialize();
 PyObject *pModule = NULL;
 PyObject *pFunc = NULL;
 pModule = PyImport_ImportModule("hello");    //這里是要調(diào)用的文件名
 pFunc = PyObject_GetAttrString(pModule, "printHello"); //這里是要調(diào)用的函數(shù)名
 PyEval_CallObject(pFunc, NULL);      //調(diào)用函數(shù)
 Py_Finalize();
}

int main()
{
 int select;
 cin >> select;
 select == 1 ? cython1():cython2();
 return 0;
}

4、問題匯總(重磅)

1、為什么我包含了Python.h,c++代碼中調(diào)用也沒有報(bào)錯(cuò),但是運(yùn)行時(shí)會(huì)出現(xiàn)如下錯(cuò)誤?(暫未從根本上解決問題,仿照后面linux上的頭文件調(diào)用方法也是無效,稍后解決會(huì)更新)

main.cpp:2:10: fatal error: Python.h: No such file or directory
 #include "Python.h"
   ^~~~~~~~~~
compilation terminated.

說明沒有include成功啊,這里我猜測是由于版本問題導(dǎo)致的,暫未得到解決,但是有一種方式是絕對可以使用的,并且已經(jīng)在代碼中體現(xiàn)了,那就是…直接inlcude絕對路徑!

#include "D:\Python\Python37\include\Python.h"

可能心細(xì)的朋友已經(jīng)發(fā)現(xiàn)了,你只是包含了頭文件,鏈接庫還沒有鏈接啊!但是我當(dāng)時(shí)的心情不允許我這么細(xì)心啊,咳咳
這里打個(gè)廣告!強(qiáng)烈建議各位C/C++ develpoers,去仔細(xì)讀一下程序員的自我修養(yǎng)這本書,真的受益匪淺。
2、由于沒有鏈接靜態(tài)庫而報(bào)錯(cuò)(同上,暫時(shí)只有傻瓜式解決辦法,使用makefile解決此問題請看我之后的博客:在makefile中鏈接靜態(tài)庫)

C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0xb): undefined reference to `__imp_Py_Initialize'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0x20): undefined reference to `__imp_PyRun_SimpleStringFlags'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0x35): undefined reference to `__imp_PyRun_SimpleStringFlags'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0x3e): undefined reference to `__imp_Py_Finalize'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0x56): undefined reference to `__imp_Py_Initialize'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0x76): undefined reference to `__imp_PyImport_ImportModule'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0x91): undefined reference to `__imp_PyObject_GetAttrString'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0xb0): undefined reference to `__imp_PyEval_CallObjectWithKeywords'
C:\Users\11955\AppData\Local\Temp\ccLmGIL8.o:main.cpp:(.text+0xb9): undefined reference to `__imp_Py_Finalize'

解決辦法:鏈接靜態(tài)庫,我把D:\Python\Python37\libs這個(gè)文件夾復(fù)制到了工作空間的文件夾下,為了方便鏈接直鏈接該文件夾下所有文件。

 g++ -o main .\main.cpp -L .\libs\*
 .\main.exe

在這里插入圖片描述

VS2019中配置環(huán)境

1、step1

首先明確,如果你安裝的python是64位的,建議把VS 該項(xiàng)目下的解決方案平臺(tái)改為x64,并且環(huán)境是在特定的解決方案配置下(Debug/Release)進(jìn)行的,所以不要配置在Debug,卻在Release調(diào)用Python.h,這樣肯定會(huì)報(bào)錯(cuò):無法打開Python.h。

2、step2

右鍵project打開屬性,在配置屬性 - C/C++ - 常規(guī) - 附加包含目錄下添加:

D:\Python\Python37\include

配置屬性 - VC++目錄 - 庫目錄下添加:

D:\Python\Python37\libs

3、測試

C++代碼和python代碼同上,到此我們還沒有在VS項(xiàng)目中添加python代碼,只需要將hello.py復(fù)制到main.cpp所在目錄即可。

4、問題匯總

1、如果遇到Link110:無法打開python36_d.lib(或者python**_d.lib),在你的python/libs目錄下會(huì)發(fā)現(xiàn)沒有這個(gè)靜態(tài)庫文件,這時(shí)候最簡單的做法就是拷貝復(fù)制一份python36.lib,并重命名為python36_d.lib
2、如果出現(xiàn)的錯(cuò)誤:

Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'hello' is not defined

這是由于沒有找到hello.py文件,解決方案:在初始化python解釋器以后添加以下兩行代碼,用于指定模塊的路徑:

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

3、如果還有錯(cuò)誤,請參考C++調(diào)用python。

5、完整的cpp代碼

//#include "D:\Python\Python37\include\Python.h"
//當(dāng)然,絕對路徑永遠(yuǎn)不會(huì)失效!^o^
#include <Python.h>
#include <iostream>
using namespace std;
void cython1()
{
 Py_Initialize();       //初始化python解釋器,告訴編譯器要用的python編譯器
 PyRun_SimpleString("import sys");
 PyRun_SimpleString("sys.path.append('./')");
 PyRun_SimpleString("import hello");  //調(diào)用python文件
 PyRun_SimpleString("hello.printHello()"); //調(diào)用上述文件中的函數(shù)
 Py_Finalize();       //結(jié)束python解釋器,釋放資源
}

void cython2()
{
 Py_Initialize();
 PyObject* pModule = NULL;
 PyObject* pFunc = NULL;
 PyRun_SimpleString("import sys");
 PyRun_SimpleString("sys.path.append('./')");
 pModule = PyImport_ImportModule("hello");    //這里是要調(diào)用的文件名
 pFunc = PyObject_GetAttrString(pModule, "printHello"); //這里是要調(diào)用的函數(shù)名
 PyEval_CallObject(pFunc, NULL);      //調(diào)用函數(shù)
 Py_Finalize();
}

int main()
{
 int select;
 cin >> select;
 select == 1 ? cython1() : cython2();
 return 0;
}

Linux中配置環(huán)境

其實(shí)這一部分有點(diǎn)多余,因?yàn)槲以赩Scode下編程也采用gcc/g++編譯器,linux與之相同,所以遇到的問題也是一致的,都是沒有辦法直接#include<Python.h>。以Ubuntu 18.04.4 LTS為例:

1、step1

前提是你已經(jīng)安裝了g++,如果使用g++ -v查看版本無果,采用以下命令安裝套件:

sudo apt-get install build-essential

首先查看自己的python版本以及位置,位置用于代碼編寫調(diào)用頭文件,版本用于編譯g++命令的指示鏈接庫。由于ubuntu18.04自帶python3,所以命令中都采用了python3而不是python:

python3 -V
>Python 3.6.9

which python3
>/usr/bin/python3

2、step2

找到版本以及位置,在C++代碼中采用絕對路徑的方法調(diào)用Python.h

#include "/usr/include/python3.6/Python.h"
//或者
#include <python3.6/Python.h>

同時(shí)也要在初始化python解釋器以后添加以下兩行代碼,用于指定模塊的路徑:

Py_Initialize();
PyRun_SimpleString("import sys"); // add 1
PyRun_SimpleString("sys.path.append('./')"); //add 2

3、測試

同樣在編譯時(shí)需要指定靜態(tài)鏈接庫,不然的話就用makefile吧~
注意python的版本:

g++ -o main main.cpp -lpython3.6m
./main

注意,也可以采用編譯時(shí)包含頭文件的方式,這樣就不用在代碼中調(diào)用頭文件了,不推薦(這樣的命令我要它有何用):

g++ -o main main.cpp -lpython3.6m -I /usr/include/python3.6
./main

4、疑問

1、為什么VScode不用再代碼中指定python文件的路徑,而VS和Linux中都需要?
2、為什么在VS2019和Linux中都不用絕對路徑就可以調(diào)用Python.h文件,而在VScode中卻沒有作用?
還望與各位朋友探討。

到此這篇關(guān)于詳解如何在VS2019和VScode中配置C++調(diào)用python接口的文章就介紹到這了,更多相關(guān)C++調(diào)用python接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中的四種常量詳解

    C語言中的四種常量詳解

    本篇文章是c語言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說明)請大家持續(xù)關(guān)注腳本之家
    2021-10-10
  • C++11?constexpr使用詳解

    C++11?constexpr使用詳解

    constexpr是一種比const?更嚴(yán)格的束縛,?它修飾的表達(dá)式本身在編譯期間可知,?并且編譯器會(huì)盡可能的?evaluate?at?compile?time,本文重點(diǎn)給大家介紹C++11?constexpr使用,需要的朋友可以參考下
    2021-12-12
  • 利用C語言模擬實(shí)現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)

    利用C語言模擬實(shí)現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何通過C語言模擬實(shí)現(xiàn)qsort(采用冒泡的方式),strcpy,strcat,strcmp等函數(shù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-11-11
  • C++?超詳細(xì)講解stack與queue的使用

    C++?超詳細(xì)講解stack與queue的使用

    C++?Stack(堆棧)?是一個(gè)容器類的改編,為程序員提供了堆棧的全部功能,也就是說實(shí)現(xiàn)了一個(gè)先進(jìn)后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了?queue?容器。queue?容器可以用來表示超市的結(jié)賬隊(duì)列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫事務(wù)隊(duì)列
    2022-03-03
  • C++分步實(shí)現(xiàn)職工管理系統(tǒng)詳解

    C++分步實(shí)現(xiàn)職工管理系統(tǒng)詳解

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C語言float內(nèi)存布局示例詳解

    C語言float內(nèi)存布局示例詳解

    這篇文章主要為大家介紹了C語言float內(nèi)存布局示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 如何在TC2.0中調(diào)用匯編程序

    如何在TC2.0中調(diào)用匯編程序

    本篇文章介紹了,如何在TC2.0中調(diào)用匯編程序的解決方法。需要的朋友參考下
    2013-05-05
  • 帶頭結(jié)點(diǎn)單鏈表(詳解)

    帶頭結(jié)點(diǎn)單鏈表(詳解)

    這篇文章主要介紹了帶頭結(jié)點(diǎn)單鏈表?(詳解),需要的朋友可以參考下
    2023-07-07
  • C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲

    C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • c語言 字符串的拼接和分割實(shí)例

    c語言 字符串的拼接和分割實(shí)例

    今天小編就為大家分享一篇c語言 字符串的拼接和分割實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

萝北县| 定结县| 江西省| 鹤庆县| 金山区| 龙里县| 泰兴市| 邵阳市| 自治县| 洪泽县| 聂拉木县| 通许县| 无棣县| 始兴县| 通许县| 顺平县| 聂拉木县| 射阳县| 通城县| 海盐县| 榕江县| 通榆县| 南京市| 新化县| 铜山县| 开远市| 鹿邑县| 巴青县| 柏乡县| 太湖县| 新蔡县| 桃源县| 图木舒克市| 眉山市| 客服| 潍坊市| 罗田县| 遂昌县| 水城县| 册亨县| 高平市|