python3使用ctypes在windows中訪問C和C++動態連結庫函數示例

2020-12-14 百家號

python3使用ctypes在windows中訪問C和C++動態連結庫函數示例

這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫

一 測試環境介紹和準備

測試環境:

作業系統:windows10

Python版本:3.7.0

VS版本:vs2015社區版(免費)

相關工具下載:

VS版本vs2015社區版(免費)

Python3.7.0 (源碼和安裝文件)

http://ffmpeg.club/python

二 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文件導出設置到當前項目路徑,並完成編譯

我們編譯出win32的debug庫,注意位數不能錯,如果是python是64位的也編譯64位的庫

三 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++函數因為有重載函數名不確定,所以無法訪問。

運行測試結果

測試成功,第一步我們完成,下一篇文章再開始來添加參數和返回值

相關焦點

  • python調用C++: ctypes庫教程
    一、準備C++代碼注意,使用ctypes庫調用C++代碼時,由於C++相比於C多了函數重載的特性,因此一個函數不能僅僅使用其名字來確定
  • C++基礎語法梳理:Windows 的動態連結庫
    CUI(Console User Interface)應用,連結器選項:/SUBSYSTEM:CONSOLE_tWinMain 與 _tmain 函數聲明Int WINAPI _tWinMain( HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine
  • C語言動態函數庫的製作和使用
    動態函數庫的製作和使用動態函數庫的製作步驟可以用下圖來描述,具體包括
  • 使用C++調用python3模塊中的類/函數詳細經驗
    的時候已經隨之安裝了,如此便只需找到他們並將庫文件的路徑配置到項目路徑中去。二、測試環境是否成功搭建C++初始化python環境示例函數:// test.cpp 中的初始化函數int init_env(char* mode){ printf("init python env\n"); // 設置python路徑 替換為你自己的python環境/虛擬環境的路徑 Py_SetPath
  • python+C、C++混合編程的應用
    我看到的一個很好的Python與c/c++混合編程的應用是NS3(Network Simulator3)一款網絡模擬軟體,它的內部計算引擎需要用高性能,但在用戶建模部分需要靈活易用。NS3的選擇是使用C/C++來模擬核心部件和協議,用python來建模和擴展。這篇文章介紹python和c/c++三種混合編程的方法,並對性能加以分析。
  • Python與C/C++混合編程
    <iostream>#define DLL_EXPORTS#ifdef DLL_EXPORTS#define DLL_API extern"C" __declspec(dllexport)#else#define DLL_API extern"C" __declspec(dllimport)#endifnamespace DynamicLib{ DLL_APIvoid
  • Python 通過 ctypes 調用 C 程序實例
    而且有些算法已經有開源的C庫了,我們也沒必要用Python重寫一份。那Python怎麼調用C語言寫的程序庫呢?答案就在Python提供的ctypes庫,它提供同C語言兼容的數據類型,可以很方便地調用C語言動態連結庫中的函數。
  • Python案例|混用C函數
    使用Python自帶的 ctypes 模塊在Python內直接調用C的動態連結庫代碼,這對於調用現有的庫,一些不開源的庫很有用.用Python自帶的c API來寫模塊,當然是用c/c++來編寫用 Cython 的新語法來寫擴展模塊,這種新語法看起來既像Python又像C,是個語法混合體,但還有很多人推崇, 其優點是可以同時調用C函數和Python函數。但其語法小編著實看著頭大,有興趣的可以自行研究.
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了
  • 加速程序開發 Python整合C語言模塊
    利用ctypes模塊整合Python程序和C程序ctypes模塊ctypes是Python的一個標準模塊,它包含在Python2.3及以上的版本裡。ctypes是一個Python的高級外部函數接口,它使得Python程序可以調用C語言編譯的靜態連結庫和動態連結庫。
  • Python使用ctypes模塊調用DLL函數之複數數組的參數傳遞
    引言前段時間在作信號分析處理方面的項目時,需要將時域數據通過快速傅立葉變換(FFT)轉換到頻域以便作進一步的後續處理,由於涉及到實時運算速度方面的要求,需要考慮程序算法的運算性能問題,因此,信號處理算法是在C語言裡面完成的,然後將算法的實現函數封裝到動態連結庫
  • Python使用ctypes模塊調用DLL函數之傳遞結構體參數
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了Python語言作為一種膠水語言所特有的優勢
  • 示例程序詳解MFC動態連結庫
    動態連結庫分為兩種win32和mfc動態連結庫,今天我們講解MFC動態連結庫 再閱讀本文之前,希望你看看《動態連結庫基礎詳解》
  • 簡單的Python調用C++程序
    一般來說在python調用C/C++程序主要可以分為3步:1、編寫C/C++實現程序。- 2、將C/C++程序編譯成動態庫。- 3、在Python中調用編譯生成的庫。Python在調用C/C++程序時有一些不同,需要注意。
  • python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了Python語言作為一種膠水語言所特有的優勢。
  • 在數據科學中使用 C 和 C++ | Linux 中國
    讓我們使用 C99 和 C++11 完成常見的數據科學任務。雖然 Python 和 R 之類的語言在數據科學中越來越受歡迎,但是 C 和 C++ 對於高效的數據科學來說是一個不錯的選擇。在本文中,我們將使用 C99 和 C++11 編寫一個程序,該程序使用 Anscombe 的四重奏數據集,下面將對其進行解釋。
  • ctypes(一) — 初識
    說到底,Python是一個解釋型動態腳本語言,再加上十幾年沒有解決的GIL鎖,無論是執行效率還是並發性都是Python最大的缺點。因此這個特性的存在給如今的Pythoner一個新的選擇,那些對執行效率和並發性有著極高要求的模塊,使用C來實現。
  • 用Python使用C語言程序(Windows平臺)
    qianyan在機器學習中,很多時候我們需要Python和C的混合編程,最重要的原因是為了性能效率的提升: 解釋型語言一般比編譯型語言慢,一般提高性能的有效做法是,先做性能測試,找出性能瓶頸部分,然後把瓶頸部分在擴展中實現。本文的目標是在windows平臺下(使用pycharm),實現python調用C語言編寫的程序。
  • 刻意練習—第十節《LInux c宏處理&動靜態連結庫》
    通過數學庫函數的使用示例引入了-lm這種連結參數,為後面講述動態和靜態連結庫打下了基礎。2.11.自己製作靜態連結庫並使用本節演示自己製作靜態連結庫,並且使用自己寫的靜態連結庫。2.12.自己製作動態連結庫並使用本節演示自己編寫編譯動態連結庫,並且使用自己編寫的動態連結庫,通過本節希望大家能夠掌握庫的使用(編譯時、連接時和運行時下的不同要求)。
  • c編譯器so easy,gcc c編譯器生成、使用動靜態庫
    如果你對如何在linux環境下使用gcc c編譯器生成和使用靜態庫、動態庫的內容存在一定興趣,不妨繼續往下閱讀哦。1.什麼是庫在windows平臺和linux平臺下都大量存在著庫。本質上來說庫是一種可執行代碼的二進位形式,可以被作業系統載入內存執行。