python3使用ctypes在windows中訪問C和C++動態連結庫函式示例
python3使用ctypes在windows中訪問C和C++動態連結庫函式示例
這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫
一 測試環境介紹和準備
測試環境:
作業系統:windows10
Python版本:3.7.0
VS版本:vs2015社群版(免費)
相關工具下載:
VS版本vs2015社群版(免費)
Python3.7.0 (原始碼和安裝檔案)
二 C/C++部分程式碼
1 首先完成C/C++的動態連結庫,與做python擴充套件庫不同,ctypes呼叫的c++庫其實與python沒有程式碼關聯,只是提供了開放公共標準。
2 建立VS的win32專案,選擇DLL庫的空專案,也可以選擇匯出符號,他會幫你把動態庫的一些巨集做好。
3 建立testctypes.cpp程式碼
其中extern "C"表示將此函式編譯為c語言函式,如果你原始碼是.c也就是用c語言編譯則不需要加extern "C"。
__declspec(dllexport) 是windows中特有的匯出庫函式,如果沒有這個庫函式是訪問不到的,如果做跨平臺到linux中可以通過巨集語法把它去掉。
4 將dll檔案匯出設定到當前專案路徑,並完成編譯
我們編譯出
三 Python部分的程式碼
from ctypes import *
lib = CDLL("testctypes") #可以加路徑
lib.CFunction()
from ctypes import * 匯入ctypes庫所有類和函式
CDLL("testctype")載入具體的動態連結庫檔案,可以加入路徑比如 dll/testctype ,在windows中省略動態庫的字尾名dll,python會找testctype.dll的檔案。注意dll檔案可以放在python執行的路徑下,也可以放到系統路徑或者path環境變數所設定的路徑。
lib.CFunction() 載入動態連結庫中的CFunction函式,注意雖然我們用c++來做擴充套件庫,python本身也做了很多支援c++的程式碼,但ctypes訪問函式只支援C語言函式,C++函式因為有過載函式名不確定,所以無法訪問。
執行測試結果
測試成功,第一步我們完成,下一篇文章再開始來新增引數和返回值
相關課程視訊可以觀看