亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 如何在C++中調用Python

如何在C++中調用Python

熱門標簽:沈陽人工外呼系統價格 沈陽外呼系統呼叫系統 江西省地圖標注 富錦商家地圖標注 沈陽防封電銷卡品牌 外呼系統哪些好辦 武漢外呼系統平臺 如何申請400電話費用 池州外呼調研線路

Python的安裝

為了使用Python.h這個擴展項,我們需要安裝一個python*-dev而不是python*,這兩者略有區別,下面的案例展示的是在Ubuntu20.04下安裝python3.9-dev的方法:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ sudo apt install python3.9-dev
正在讀取軟件包列表... 完成
正在分析軟件包的依賴關系樹       
正在讀取狀態信息... 完成       
下列軟件包是自動安裝的并且現在不需要了:
  chromium-codecs-ffmpeg-extra gstreamer1.0-vaapi
  libgstreamer-plugins-bad1.0-0 linux-headers-5.8.0-43-generic
  linux-hwe-5.8-headers-5.8.0-43 linux-image-5.8.0-43-generic
  linux-modules-5.8.0-43-generic linux-modules-extra-5.8.0-43-generic
使用'sudo apt autoremove'來卸載它(它們)。
將會同時安裝下列軟件:
  libexpat1-dev libpython3.9 libpython3.9-dev zlib1g-dev
下列【新】軟件包將被安裝:
  libexpat1-dev libpython3.9 libpython3.9-dev python3.9-dev zlib1g-dev
升級了 0 個軟件包,新安裝了 5 個軟件包,要卸載 0 個軟件包,有 30 個軟件包未被升級。
需要下載 6,613 kB 的歸檔。
解壓縮后會消耗 28.7 MB 的額外空間。
您希望繼續執行嗎? [Y/n] Y
獲取:1 http://repo.huaweicloud.com/ubuntu focal/main amd64 libexpat1-dev amd64 2.2.9-1build1 [116 kB]
獲取:2 http://repo.huaweicloud.com/ubuntu focal-updates/universe amd64 libpython3.9 amd64 3.9.0-5~20.04 [1,710 kB]
獲取:3 http://repo.huaweicloud.com/ubuntu focal-updates/universe amd64 libpython3.9-dev amd64 3.9.0-5~20.04 [4,119 kB]
獲取:4 http://repo.huaweicloud.com/ubuntu focal-updates/main amd64 zlib1g-dev amd64 1:1.2.11.dfsg-2ubuntu1.2 [155 kB]
獲取:5 http://repo.huaweicloud.com/ubuntu focal-updates/universe amd64 python3.9-dev amd64 3.9.0-5~20.04 [512 kB]
已下載 6,613 kB,耗時 4秒 (1,594 kB/s)
正在選中未選擇的軟件包 libexpat1-dev:amd64。
(正在讀取數據庫 ... 系統當前共安裝有 269544 個文件和目錄。)
準備解壓 .../libexpat1-dev_2.2.9-1build1_amd64.deb  ...
正在解壓 libexpat1-dev:amd64 (2.2.9-1build1) ...
正在選中未選擇的軟件包 libpython3.9:amd64。
準備解壓 .../libpython3.9_3.9.0-5~20.04_amd64.deb  ...
正在解壓 libpython3.9:amd64 (3.9.0-5~20.04) ...
正在選中未選擇的軟件包 libpython3.9-dev:amd64。
準備解壓 .../libpython3.9-dev_3.9.0-5~20.04_amd64.deb  ...
正在解壓 libpython3.9-dev:amd64 (3.9.0-5~20.04) ...
正在選中未選擇的軟件包 zlib1g-dev:amd64。
準備解壓 .../zlib1g-dev_1%3a1.2.11.dfsg-2ubuntu1.2_amd64.deb  ...
正在解壓 zlib1g-dev:amd64 (1:1.2.11.dfsg-2ubuntu1.2) ...
正在選中未選擇的軟件包 python3.9-dev。
準備解壓 .../python3.9-dev_3.9.0-5~20.04_amd64.deb  ...
正在解壓 python3.9-dev (3.9.0-5~20.04) ...
正在設置 libpython3.9:amd64 (3.9.0-5~20.04) ...
正在設置 libexpat1-dev:amd64 (2.2.9-1build1) ...
正在設置 zlib1g-dev:amd64 (1:1.2.11.dfsg-2ubuntu1.2) ...
正在設置 libpython3.9-dev:amd64 (3.9.0-5~20.04) ...
正在設置 python3.9-dev (3.9.0-5~20.04) ...
正在處理用于 man-db (2.9.1-1) 的觸發器 ...
正在處理用于 libc-bin (2.31-0ubuntu9.2) 的觸發器 ...

安裝完成后,如果在當前命令行下運行python3.9,是可以看到一個python專屬的命令行界面的,可以通過exit()退出。但是我們這里側重的是跟C++的配合工作,因此我們更加關注lib和include目錄下是否有生成相關的目錄,可以執行如下指令進行查看:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ ll /usr/lib/ | grep python
drwxr-xr-x  26 root root   20480 5月   7 16:27 python2.7/
drwxr-xr-x   3 root root    4096 2月  10 02:47 python3/
drwxr-xr-x  30 root root   20480 5月   7 16:30 python3.8/
drwxr-xr-x  31 root root   12288 5月  20 16:31 python3.9/

這里我們看到有一個3.9的版本,也就是我們剛才安裝的版本,再看看include下的目錄:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ ll /usr/include/ | grep python
drwxr-xr-x  2 root root   4096 5月   7 16:31 python3.8/
drwxr-xr-x  4 root root   4096 5月  20 16:31 python3.9/

這里我們就可以看到一些區別了,有一些版本的python不一定會有這兩個目錄,但是只有具備了這兩個目錄,才能夠被C++調用。

VS Code配置

這里我們使用的IDE是VS Code,但是上述提到的幾個路徑,在VS Code中默認是不被包含的,因此在代碼編輯的過程中在include Python.h>這一步就會報錯了。這一章節的目的主要是解決IDE中的報錯問題,還不是最終運行中出現的問題,因為運行時我是通過命令行執行g++來運行的,而不是直接用IDE來跑。首先在VS Code界面上按順序同時按住:ctrl+shift+P,在彈出的窗口中輸入C/C++ Edit Configurations(JSON)查找相關JSON配置文件,在列表中點擊后會自動在VS Code中打開這個配置文件:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "c++11",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

我們所需要做的工作就是,在這個includePath中把相關的路徑都加上,比如我這邊添加的路徑是以下3個:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/python3.9/",
                "/usr/lib/python3.9/",
                "/usr/include/python3.9/cpython/"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "c++11",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

添加后,include Python.h>就不會顯示報錯了。

Hello World測試

行業潛規則,我們先用C++來調用一個Python的打印函數,輸出Hello World試試:

// cp.cpp
#include Python.h>
int main(int argc, char *argv[]) {
  Py_Initialize();
  PyRun_SimpleString("print('hello world')\n");
  Py_Finalize();
  return 0;
}

這里需要注意的是一個運行方式,我們是用g++來進行編譯的,但是g++默認是找不到我們剛才在IDE中所設定的幾個includePath的,因此需要我們手動在編譯的時候加上幾個參數。這些參數其實也可以運行python3.9-config去一個一個查看,這里我們直接推薦一種可以運行成功的參數,其中最重要的是-I和-l這兩個路徑一定要包含:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ -o cpy cp.cpp -lm -std=c++11 -I/usr/include/python3.9/ -lpython3.9
dechin@ubuntu2004:~/projects/gitlab/dechin/$ ll
總用量 4697388
drwxrwxr-x 2 dechin dechin       4096 5月  20 17:10 ./
drwxrwxr-x 8 dechin dechin       4096 5月  19 15:32 ../
-rw-rw-r-- 1 dechin dechin        152 5月  20 17:04 cp.cpp
-rwxrwxr-x 1 dechin dechin      16776 5月  20 17:10 cpy*

運行完成后,就會在當前目錄下生成一個剛才指定的名字cpy的一個可執行文件,如果是windows系統,則會生成一個cpy.exe的文件。讓我們執行這個文件:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ ./cpy 
hello world

成功打印Hello World,又離成功更近了一步。

調用Python函數string.split()

在C++中如果我們想分割一個字符串,雖然說也是可以實現的,但是應該沒有比Python中執行一個string.split()更加方便快捷的方案了,因此我們測試一個用C++調用Python的split函數的功能。

第一次嘗試

一開始我們是寫了這樣一個簡單的案例,用PyImport_ImportModule方法去調用pysplit這個python模塊:

// cp.cpp
#include Python.h>
#include iostream>
using namespace std;
int main(int argc, char *argv[])
{
  Py_Initialize();
  if (!Py_IsInitialized())
	{
		cout  "Initialize failed!"  endl;
		return 0;
	}
  PyObject* pModule = NULL;
  PyObject* pFunc;
  PyRun_SimpleString("import os");
  PyRun_SimpleString("os.system('pwd')");
  pModule = PyImport_ImportModule("pysplit");
  if (pModule == NULL)
	{
		cout  "Module Not Found!"  endl;
	}
  // pFunc = PyObject_GetAttrString(pModule, "sp");
  // PyObject* args = Py_BuildValue("s", "Test String Hello Every One !");
  // PyObject* pRet = PyObject_CallObject(pFunc, args);
  string cList[10];
  // PyArg_Parse(pRet, "[items]", cList);
  cout  "res:"  cList  endl;
  Py_Finalize();
  return 0;
}

對應的Python模塊的內容為:

# pysplit.py

def sp(string):
    return string.split()

這是一個非常簡單的函數,但是我們在調用的時候就直接返回了一個錯誤:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ -o cpy cp.cpp -lm -std=c++11 -I/usr/include/python3.9/ -lpython3.9  ./cpy
['pysplit.py', 'cpy', 'cp.cpp']
Module Not Found!
res:0x7ffc622ae900

這個錯誤是說,找不到pysplit這個模塊。但是我們同時借助于PyRun_SimpleString調用了Python中的os庫,執行了一個查看路徑和當前路徑下文件的功能,我們發現這個C++文件和需要引入的pysplit.py其實是在同一個路徑下的,這就很奇怪了沒有導入成功。

第二次嘗試

經過一番的資料查詢,最后發現,即使是在相同的路徑下,也需要通過Python的sys將當前目錄添加到系統路徑中,才能夠識別到這個模塊,同樣也是使用PyRun_SimpleString的函數:

// cp.cpp
#include Python.h>
#include iostream>
using namespace std;
int main(int argc, char *argv[])
{
  Py_Initialize();
  if (!Py_IsInitialized())
	{
		cout  "Initialize failed!"  endl;
		return 0;
	}
  PyObject* pModule = NULL;
  PyObject* pFunc;
  PyRun_SimpleString("import sys");
  PyRun_SimpleString("sys.path.append('./')");
  pModule = PyImport_ImportModule("pysplit");
  if (pModule == NULL)
	{
		cout  "Module Not Found!"  endl;
	}
  pFunc = PyObject_GetAttrString(pModule, "sp");
  PyObject* args = Py_BuildValue("s", "Test String Hello Every One !");
  PyObject* pRet = PyObject_CallObject(pFunc, args);
  string cList[10];
  // PyArg_Parse(pRet, "[items]", cList);
  cout  "res:"  cList  endl;
  Py_Finalize();
  return 0;
}

這個也可以理解,Python中的函數調用,輸入參數都被打包成了一個tuple格式,比如**args,而類似**kwargs則是打包成一個字典格式,類似的功能在這篇博客中有所介紹。

第三次嘗試

上面的問題,在StackOverFlow上有一個類似的情況,有一個回答解決了這個問題,解決方案是,用PyObject_CallFunctionObjArgs來替代PyObject_CallObject去實現函數調用命令,相關代碼如下:

// cp.cpp
#include Python.h>
#include iostream>
using namespace std;
int main(int argc, char *argv[])
{
  Py_Initialize();
  if (!Py_IsInitialized())
	{
		cout  "Initialize failed!"  endl;
		return 0;
	}
  PyObject* pModule = NULL;
  PyObject* pFunc;
  PyRun_SimpleString("import sys");
  PyRun_SimpleString("sys.path.append('./')");
  pModule = PyImport_ImportModule("pysplit");
  if (pModule == NULL)
	{
		cout  "Module Not Found!"  endl;
	}
  pFunc = PyObject_GetAttrString(pModule, "sp");
  PyObject* args = Py_BuildValue("s", "Test String Hello Every One !");
  PyObject* pRet = PyObject_CallFunctionObjArgs(pFunc, args, NULL);
  int size = PyList_Size(pRet);
  cout  "List size is: "  size  endl;
  for(int i=0;isize;i++)
  {
    PyObject* cRet = PyList_GET_ITEM(pRet, i);
    char* s;
    PyArg_Parse(cRet, "s", s);
    cout  "The "  i  "th term is: "  s  endl;
  }
  Py_Finalize();
  return 0;
}

最后,因為從Python中獲取的是一個List格式的數據,因此我們首先需要用PyList_GET_ITEM去逐項提取,然后用PyArg_Parse將提取出來的元素保存到一個C++的char字符串中,執行結果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ -o cpy cp.cpp -lm -std=c++11 -I/usr/include/python3.9/ -lpython3.9  ./cpy
List size is: 6
The 0th term is: Test
The 1th term is: String
The 2th term is: Hello
The 3th term is: Every
The 4th term is: One
The 5th term is: !

Yes!終于成功了!

總結概要

本文介紹了一個在C++內部調用Python中封裝的函數或者接口的方法,從環境配置到具體示例都有講解,并且在其中包含有不少的坑點,需要一步一步去踩。不同的編程語言具有不同的優勢,Python輪子眾多而語法簡單,上手容易,但是性能比較首先,C++的最明顯優勢就是在于其性能的天然優越性。但是我們不需要對哪一種編程語言有所偏倚,都有所掌握,并且能夠有所互通,利用好各自的優勢,才能夠發揮最大的價值。

以上就是如何在C++中調用Python的詳細內容,更多關于C++ 調用Python的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 養成良好的C++編程習慣之內存管理的應用詳解
  • C++實現簡單貪吃蛇小游戲
  • C++ map的簡單使用實現
  • c++實現簡單隨機數的代碼
  • C++線程間的互斥和通信場景分析
  • 如何通過wrap malloc定位C/C++的內存泄漏問題
  • 解析Linux下C++編譯和鏈接
  • C++編譯器Clion的使用詳解(總結)
  • 詳解c++良好的編程習慣與編程要點

標簽:銅川 通遼 黑龍江 株洲 阿里 常德 潛江 呂梁

巨人網絡通訊聲明:本文標題《如何在C++中調用Python》,本文關鍵詞  如,何在,C++,中,調用,Python,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何在C++中調用Python》相關的同類信息!
  • 本頁收集關于如何在C++中調用Python的相關信息資訊供網民參考!
  • 推薦文章
    一级片免费在线观看视频| 台湾美女古装一级毛片| 亚欧乱色一区二区三区| 亚洲天堂在线播放| 亚州视频一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美激情一区二区三区视频 | 午夜在线亚洲男人午在线| 久久成人性色生活片| 99久久精品费精品国产一区二区| 国产视频一区二区在线播放| 精品国产三级a| 精品视频在线看| 99热视热频这里只有精品| 亚洲 激情| 欧美激情一区二区三区中文字幕| 国产亚洲免费观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 91麻豆精品国产自产在线观看一区 | 免费一级片网站| 国产精品1024永久免费视频 | 韩国三级视频在线观看| 国产精品自拍亚洲| 亚洲不卡一区二区三区在线| 国产综合成人观看在线| 韩国三级视频网站| 一级女性全黄生活片免费| 99久久精品国产国产毛片 | 日韩av成人| 99色精品| 精品国产三级a| 97视频免费在线| 四虎久久精品国产| 精品美女| 九九精品影院| 欧美大片a一级毛片视频| 国产不卡在线观看| 久久精品大片| 四虎影视库国产精品一区| 国产麻豆精品hdvideoss| 欧美国产日韩在线| 一本高清在线| 久久国产精品自由自在| 国产成人精品综合在线| 国产福利免费视频| 久久精品欧美一区二区| 四虎影视久久久免费| 99久久精品国产免费| 日韩专区在线播放| 99久久精品国产高清一区二区 | 天天色成人| 久久国产精品自由自在| 香蕉视频久久| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本特黄特黄aaaaa大片| 免费毛片播放| 日韩中文字幕一区| 亚洲爆爽| 天天色成人网| 二级片在线观看| 精品国产一区二区三区久| 999精品在线| 91麻豆tv| 免费一级片在线| 一本伊大人香蕉高清在线观看| 国产精品免费久久| 国产福利免费视频| 美女免费精品高清毛片在线视| 国产a视频| 99久久网站| 黄视频网站在线观看| 国产高清在线精品一区a| 国产亚洲精品aaa大片| 日本在线不卡视频| 国产91素人搭讪系列天堂| 国产伦久视频免费观看视频| 日韩专区亚洲综合久久| 一a一级片| 精品久久久久久中文字幕2017| 天天做日日爱夜夜爽| 国产视频一区二区在线观看| 久久国产精品自由自在| 青青久久精品| 日韩av成人| 成人a级高清视频在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产成人精品在线| 麻豆系列 在线视频| 欧美1区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 可以免费看毛片的网站| 欧美激情中文字幕一区二区| 在线观看成人网 | 精品久久久久久免费影院| 亚洲 欧美 成人日韩| 一a一级片| 天天色成人| 欧美日本韩国| 999久久狠狠免费精品| 国产精品自拍一区| 香蕉视频三级| 青青青草影院 | 韩国毛片| a级毛片免费全部播放| 国产不卡在线观看视频| 91麻豆精品国产片在线观看| 你懂的福利视频| 精品视频在线观看免费| 亚洲第一色在线| 免费国产在线观看不卡| 国产成人啪精品| 午夜激情视频在线播放| 国产美女在线一区二区三区| 亚欧乱色一区二区三区| 一级毛片视频免费| 亚洲精品永久一区| 97视频免费在线观看| 九九热精品免费观看| 国产亚洲精品aaa大片| 亚洲女人国产香蕉久久精品 | 在线观看成人网 | 天天色成人| 一级毛片视频免费| 麻豆午夜视频| 成人影院一区二区三区| 亚欧视频在线| 国产成人欧美一区二区三区的| 精品国产香蕉在线播出 | 成人免费观看男女羞羞视频| 麻豆系列国产剧在线观看| 国产原创中文字幕| 台湾毛片| 天天色成人| 成人免费网站久久久| 国产一区二区精品在线观看| 国产麻豆精品hdvideoss| 九九热精品免费观看| 精品国产亚一区二区三区| 99久久精品国产麻豆| 青青青草影院 | 成人影视在线播放| 中文字幕一区二区三区精彩视频| 精品国产亚洲人成在线| 国产a网| 久久精品免视看国产成人2021| 黄视频网站免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 91麻豆精品国产片在线观看| 日韩中文字幕在线观看视频| 亚洲第一色在线| 天堂网中文字幕| 国产不卡在线播放| 欧美激情伊人| 青青青草影院 | 美女免费精品视频在线观看| 黄视频网站在线观看| 精品国产一区二区三区精东影业| 99久久精品费精品国产一区二区| 国产91精品一区| 欧美激情一区二区三区视频高清| 精品国产一区二区三区久久久蜜臀| 亚洲 男人 天堂| 国产伦久视频免费观看视频| 成人高清视频免费观看| 99久久精品国产免费| 国产激情视频在线观看| 国产精品1024永久免费视频 | 久草免费资源| 日韩一级精品视频在线观看| 亚洲爆爽| 国产福利免费视频| 国产视频一区在线| 欧美激情中文字幕一区二区| 日日夜夜婷婷| 国产一级强片在线观看| 日韩av东京社区男人的天堂| 精品视频在线看| 九九干| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品久久久久久中文| 成人a级高清视频在线观看| 国产综合91天堂亚洲国产| 四虎影视库| 精品国产一区二区三区免费| 你懂的日韩| 日韩欧美一二三区| 欧美另类videosbestsex高清| 午夜家庭影院| 91麻豆精品国产自产在线 | 精品视频在线观看一区二区三区| 日韩一级黄色大片| 日日爽天天| 91麻豆精品国产高清在线| 亚洲 国产精品 日韩| 日韩免费在线视频| 日本乱中文字幕系列| 一级毛片视频播放| 精品国产一区二区三区久| 久久国产影院| 日本免费区|