python呼叫C 之pybind11入門

2021-08-14 09:27:15 字數 2146 閱讀 9636

python呼叫c/c++有不少的方法,如boost.python, swig, ctypes, pybind11等,這些方法有繁有簡,而pybind11的優點是對c++ 11支援很好,api比較簡單,現在我們就簡單記下pybind11的入門操作。

mkdir

build

cdbuild

cmake..

cmake--

build.-

-config

release--

target

check

如果所有測試用例都通過了,說明安裝成功了。

#include 

namespace py = pybind11;

int add(int i, int j)

pybind11_module(example, m)

然後,在windows下使用工具vs2015 x86 native tools command prompt(因為我的python是32位版本,如果是64位版本的,請使用vs2015 x64 native tools command prompt)進行編譯:

cl example.cpp /i "h:/allfiles/pybind11/include" /i "c:/python27/include" /ld /fe:example.pyd /link/libpath:"c:/python27/libs/"

編譯成功後,會在example.cpp相同目錄下生成example.pyd檔案,這個就是python可以直接匯入的庫,執行:

import example

example.add(3, 4)

[out]: 7

有了編譯成功的模組,便可以使用我在另一篇部落格python模組搜尋路徑中提到的方法,將其用.pth或者pythonpath的方法加入到python搜尋路徑,以後在我們自己的環境中就可以隨時隨地使用這個模組啦。

當然,我們也可以使用cmake進行編譯。首先寫乙個cmakelists.txt

cmake_minimum_required

(version

2.8.12)

project

(example)

add_subdirectory

(pybind11)

pybind11_add_module

(example example.cpp)

這裡要求example.cpp放在和pybind11同一級的目錄下,然後cmake,便會生成乙個vs 2015的工程檔案,用vs開啟工程檔案進行build,就可以生成example.pyd了。

使用pybind11,也很容易從c++裡呼叫python指令碼:

首先,我們用vs 2015新建乙個工程,並且將python的包含目錄和庫目錄,以及pybind11的包含目錄配置到工程,我的配置如下:

然後,新建乙個原始檔example.cpp:

#include 

#include

namespace py = pybind11;

int main()

最後,在工程目錄下加入指令碼example.py:

def

add(i, j):

print("hello, pybind11")

return i+j

執行工程,得到如下的結果:

執行成功!!!

本文中我們簡單介紹了怎麼使用pybind11進行python和c++的相互呼叫,這些只是入門級別的例子,但是可以work了,這很重要。深入進行研究使用,還是等以後用到再說吧。

參考文獻

pybind11 github

pybind11 tutorial

c++與python的互操作

building and testing a hybrid python/c++ package

Python路上之Python呼叫C

1 c 類檔案 pycallclass.cpp include using namespace std class testlib void testlib display void display int int a 可以由python呼叫的關鍵,只能呼叫c函式,但可以通過上述方式將c 中的類方法...

C 呼叫Python及間接呼叫Python三方庫

本文章目的是脫離安裝python環境的前提下,由c 程式呼叫python程式及python相關三方庫 紅色部分是生成路徑下直譯器執行時依賴 將紅色部分拷貝到c 編譯主exe路徑下即可,並把需要允許的py檔案頁考過去 也就是.py檔案需和編譯生成的.exe檔案放在一起 藍色部分是vs配置編譯時依賴,需...

Python之方法呼叫

python中類的方法有兩種形式 繫結的概念主要與方法呼叫相關聯,方法是類內部定義的函式 這意味著方法是類屬性而不是例項屬性 方法只有在其所屬的類擁有例項時,才能被呼叫,當存在乙個例項時,方法才被認為是繫結到那個例項了。任何乙個方法定義中的第乙個引數都是self變數,表示呼叫此方法的例項物件。cla...