混合程式設計 如何用python11呼叫C

2022-06-30 20:18:14 字數 2605 閱讀 1805

摘要:在實際開發過程中,免不了涉及到混合程式設計,比如,對於python這種指令碼語言,效能還是有限的,在一些對效能要求高的情景下面,還是需要使用c/c++來完成。
那怎樣做呢?我們能使用pybind11作為橋梁,pybind11的優點是對c++ 11支援很好,api比較簡單,現在我們就簡單記下pybind11的入門操作。

pybind11 是乙個輕量級只包含標頭檔案的庫,用於 python 和 c++ 之間介面轉換,可以為現有的 c++ **建立 python 介面繫結。pybind11 通過 c++ 編譯時的自省來推斷型別資訊,來最大程度地減少傳統拓展 python 模組時繁雜的樣板**, 已經實現了 stl 資料結構、智慧型指標、類、函式過載、例項方法等到python的轉換,其中函式可以接收和返回自定義資料型別的值、指標或引用。

直接使用pip安裝

pip3 install pybind11

由於pybind11依賴於pytest,所以在安裝前需要先把pytest給安裝上

pip3 install pytest

首先,我們編寫乙個c++原始檔,命名為example.cpp。

//

pybind11 標頭檔案和命名空間

#include namespace py =pybind11;

int add(int i, int

j)pybind11_module(example, m)

pybind11_module()巨集函式將會建立乙個函式,在由python發起import語句時該函式將會被呼叫。模組名字「example」,由巨集的第乙個引數指定(千萬不能出現引號)。第二個引數"m",定義了乙個py::module的變數。函式py::module::def()生成繫結**,將add()函式暴露給python。

我們使用cmake進行編譯。首先寫乙個cmakelists.txt。

cmake_minimum_required(version 2.8.12

)project(example)

add_subdirectory(pybind11)

pybind11_add_module(example example.cpp)

就是cmakelist.txt和example.cpp放在乙個目錄下面。

cmake .

make

會生成example.cpython-36m-x86_64-linux-gnu.so檔案。

這個檔案就是python可以呼叫的檔案。還是在相同目錄下執行python,進入python命令列

import example

example.add(

3, 4)[

out]: 7

在使用python程式設計時,常使用內建容器作為函式的引數和返回值,python語言的這種特性使我們的程式變得非常靈活和易於理解。那麼在使用pybind11封裝c++實現的函式的時候,如何保留這一特性呢?本文介紹pybind11實現list和dict作為引數及返回值的方法。

//

檔名:func.cpp

#include "

func.h

"vector

list_square(vector &in_list, vector&out_list)

return

out_list;

}

map dict_square(map& in_dict, map&out_dict));

iter++;

} return

out_dict;

}

//

#include #include

#include

"func.h

"pybind11_module(square, m)

#include #include 

struct

foo ;

void

show(foo f)

namespace py =pybind11;

pybind11_plugin(example)

import sys".

")import example

b =example.foo

b.a = "

hello

"example.show(b)

pybind11 — seamless operability between c++11 and python

python呼叫c++之pybind11入門

python呼叫c++利器–pybind11

基於pybind11實現python呼叫c++編寫的cv演算法–下 (linux+cmake)

跟我一起學習pybind11 之一

passing by value #161

pybind11封裝的函式實現內建容器作為引數及返回值

點選關注,第一時間了解華為雲新鮮技術~

混合程式設計 如何用pybind11呼叫C

摘要 在實際開發過程中,免不了涉及到混合程式設計,比如,對於python這種指令碼語言,效能還是有限的,在一些對效能要求高的情景下面,還是需要使用c c 來完成。在實際開發過程中,免不了涉及到混合程式設計,比如,對於python這種指令碼語言,效能還是有限的,在一些對效能要求高的情景下面,還是需要使...

c 和Python混合程式設計

1.設定環境 1 在vs的附加包含目錄中新增python的include路徑 2 在vs linker的附加庫目錄中新增python的libs路徑 3 注意,如果安裝的python是64位的,那麼vs工程也要是一直對應的x64活動平台,否則會報 無法解析的外部符號 imp py initialize...

python使用ctypes與C混合程式設計

python作為膠水,可以非常方便地和其他語言進行混合程式設計,當然和c混合程式設計的方式也有很多種,如使用cyptes cython boost swig等等。使用混合程式設計的好處在於可以理由各個語言優勢,完成整個功能,如c語言的效率就明顯高於python語言。ctypes的方式,主要流程是將c...