技術積累——C++ 呼叫 python 專案

西米發表於2024-08-09

背景

公司目前用 C++ 在開發一些專案,但是某些演算法部分為了提效(開發效率),使用了 python 指令碼開發;為了 python 專案部分合入 C++

方案

目前想到兩個方案:
1、python 指令碼轉成 C++:這塊就需要一個非常專業的 C++ 高手來做,並且 python 的第三方庫太優秀了,很多 C++ 都是沒有現成的,時間成本太大了
2、C++ 呼叫 python:從執行效率上來講,python 肯定會比 C++ 慢,但是在資料處理方面,是 python 的強項,所以我們選擇了這種方案

制定具體方案

使用 C++ 呼叫 python 也有幾種方式:
1、把 python 打包成可執行檔案,透過新增引數呼叫
2、直接使用 C++ 呼叫 python 指令碼
3、直接使用 C++ 呼叫命令列 python.exe 直譯器

實施

可執行檔案方式

我們最開始先用了這個方式來做,打包選用的 pyinstaller,之前用過 python 編寫 GUI 的同學可能都知道,有一個很惱火的地方是每次打包出來的檔案非常大,至少都是幾十 M 起步,就算使用 upx 壓縮工具,基本壓縮有也有幾兆
我們打包成功後,直接使用命令列執行嘗試:發現一個目前能力上無法理解的問題:正常指令碼執行只需要 1.6s 左右;打包成 exe 後執行需要 5~9s(希望大佬幫忙解釋下),雖然能用,但是效能消耗太大了

C++ 呼叫 python 專案

這個網上很多教程,找到一個沒坑的:https://zhuanlan.zhihu.com/p/271219435
也是可以直接使用,執行之後,耗時執行 python 只花費了不到 1s
但是有個核心問題就是能看到原始碼,所以又考慮到這個問題,最後又去把核心原始碼打包成 pyd 格式

步驟如下:
1、構建 setup.py 指令碼:

from setuptools import setup
from Cython.Build import cythonize

setup(name='my_module', ext_modules=cythonize(r'F:\py\temp\my_module.py'))

2、在命令列中,執行命令:python setup.py build_ext --inplace

python: Python 直譯器可執行檔案的路徑(預設使用環境變數的配置路徑)。
setup.py:Python 指令碼檔案,用於定義 Python 包的構建和安裝方式。通常,這個檔案會包含一些後設資料和構建指令,以告訴 setuptools(Python 的一個包管理工具)如何構建和安裝這個包。
python setup.py:使用 python 命令,執行 Python 指令碼檔案。
build_ext: Python 定義的一個命令,用於構建擴充套件模組。
--inplace:可選。表示編譯後的 .pyd 檔案儲存在預設的構建目錄中,複製一份到當前目錄中。

這樣就可以使用 C++ 呼叫 python 了!

當然肯定會有很多其他方式處理該問題,如果各位大佬有更好的方式,可以留言哦

相關文章