這篇文章給大家介紹怎么在VS2019與VScode中對(duì)python接口進(jìn)行調(diào)用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
目前創(chuàng)新互聯(lián)公司已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、雁山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。看到這個(gè)標(biāo)題有些人說(shuō)了,為什么好好的C++你非要調(diào)用python?人家明明是兩種語(yǔ)言呀!
但是在實(shí)際應(yīng)用中,有時(shí)候會(huì)用到C/C++調(diào)用python來(lái)更簡(jiǎn)單地去完成一些功能,不然人家python為什么有一個(gè)文件夾叫include,里邊全是.h文件呢?
首先是在VScode中為C++調(diào)用python接口配置環(huán)境,這里假設(shè)你已經(jīng)配置好了c++編程環(huán)境!
用快捷鍵Ctrl+Shift+X
打開(kāi)Extensions 商店,輸入python,install:
用快捷鍵Ctrl+Shift+P
打開(kāi)命令面板,打開(kāi)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 }
測(cè)試一下:編輯hello.py
:
def printHello(): print("Hello World")
c++調(diào)用python有兩種方式,我在代碼中都進(jìn)行了測(cè)試,編輯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; }
1、為什么我包含了Python.h
,c++代碼中調(diào)用也沒(méi)有報(bào)錯(cuò),但是運(yùn)行時(shí)會(huì)出現(xiàn)如下錯(cuò)誤?(暫未從根本上解決問(wèn)題,仿照后面linux上的頭文件調(diào)用方法也是無(wú)效,稍后解決會(huì)更新)
main.cpp:2:10: fatal error: Python.h: No such file or directory #include "Python.h" ^~~~~~~~~~ compilation terminated.
說(shuō)明沒(méi)有include成功啊,這里我猜測(cè)是由于版本問(wèn)題導(dǎo)致的,暫未得到解決,但是有一種方式是絕對(duì)可以使用的,并且已經(jīng)在代碼中體現(xiàn)了,那就是…直接inlcude絕對(duì)路徑!
#include "D:\Python\Python37\include\Python.h"
可能心細(xì)的朋友已經(jīng)發(fā)現(xiàn)了,你只是包含了頭文件,鏈接庫(kù)還沒(méi)有鏈接啊!但是我當(dāng)時(shí)的心情不允許我這么細(xì)心啊,咳咳
這里打個(gè)廣告!強(qiáng)烈建議各位C/C++ develpoers,去仔細(xì)讀一下程序員的自我修養(yǎng)這本書(shū),真的受益匪淺。
2、由于沒(méi)有鏈接靜態(tài)庫(kù)而報(bào)錯(cuò)(同上,暫時(shí)只有傻瓜式解決辦法,使用makefile解決此問(wèn)題請(qǐng)看我之后的博客:在makefile中鏈接靜態(tài)庫(kù))
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)庫(kù),我把D:\Python\Python37\libs
這個(gè)文件夾復(fù)制到了工作空間的文件夾下,為了方便鏈接直鏈接該文件夾下所有文件。
g++ -o main .\main.cpp -L .\libs\* .\main.exe
首先明確,如果你安裝的python是64位的,建議把VS 該項(xiàng)目下的解決方案平臺(tái)改為x64
,并且環(huán)境是在特定的解決方案配置下(Debug/Release)進(jìn)行的,所以不要配置在Debug,卻在Release調(diào)用Python.h,這樣肯定會(huì)報(bào)錯(cuò):無(wú)法打開(kāi)Python.h。
右鍵project打開(kāi)屬性,在配置屬性 - C/C++ - 常規(guī) - 附加包含目錄
下添加:
D:\Python\Python37\include
在配置屬性 - VC++目錄 - 庫(kù)目錄
下添加:
D:\Python\Python37\libs
C++代碼和python代碼同上,到此我們還沒(méi)有在VS項(xiàng)目中添加python代碼,只需要將hello.py
復(fù)制到main.cpp
所在目錄即可。
1、如果遇到Link110:無(wú)法打開(kāi)python36_d.lib(或者python**_d.lib),在你的python/libs
目錄下會(huì)發(fā)現(xiàn)沒(méi)有這個(gè)靜態(tài)庫(kù)文件,這時(shí)候最簡(jiǎn)單的做法就是拷貝復(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
這是由于沒(méi)有找到hello.py
文件,解決方案:在初始化python解釋器以后添加以下兩行代碼,用于指定模塊的路徑:
PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')");
3、如果還有錯(cuò)誤,請(qǐng)參考C++調(diào)用python。
//#include "D:\Python\Python37\include\Python.h" //當(dāng)然,絕對(duì)路徑永遠(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; }
其實(shí)這一部分有點(diǎn)多余,因?yàn)槲以赩Scode下編程也采用gcc/g++
編譯器,linux與之相同,所以遇到的問(wèn)題也是一致的,都是沒(méi)有辦法直接#include<Python.h>
。以Ubuntu 18.04.4 LTS為例:
前提是你已經(jīng)安裝了g++,如果使用g++ -v
查看版本無(wú)果,采用以下命令安裝套件:
sudo apt-get install build-essential
首先查看自己的python版本以及位置,位置用于代碼編寫(xiě)調(diào)用頭文件,版本用于編譯g++命令的指示鏈接庫(kù)。由于ubuntu18.04自帶python3,所以命令中都采用了python3而不是python:
python3 -V >Python 3.6.9 which python3 >/usr/bin/python3
找到版本以及位置,在C++代碼中采用絕對(duì)路徑的方法調(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
同樣在編譯時(shí)需要指定靜態(tài)鏈接庫(kù),不然的話就用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
關(guān)于怎么在VS2019與VScode中對(duì)python接口進(jìn)行調(diào)用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前題目:怎么在VS2019與VScode中對(duì)python接口進(jìn)行調(diào)用-創(chuàng)新互聯(lián)
標(biāo)題URL:http://jinyejixie.com/article42/csdsec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信公眾號(hào)、面包屑導(dǎo)航、ChatGPT、外貿(mào)建站、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容