python3調(diào)用c語言代碼的全過程記錄
開發(fā)環(huán)境
linux: python3.5.2 + ubuntu-gnome-16.04-desktop-amd64
windows:cygwin + powershell + python3.6
膠水語言python為什么要調(diào)用c代碼?
c與python對(duì)比python不擅長(zhǎng)"大量運(yùn)算"任務(wù),python程序優(yōu)勢(shì)在于:編寫簡(jiǎn)單,適合"IO密集型作業(yè)"(比如打開文件,下載圖片,運(yùn)行腳本)。python作為知名的"膠水語言",快速實(shí)現(xiàn)"計(jì)算密集型作業(yè)"的方法就是"把c的代碼拿過來直接用"。
Python中的ctypes模塊可能是Python調(diào)用C方法中最簡(jiǎn)單的一種。ctypes模塊提供了和C語言兼容的數(shù)據(jù)類型和函數(shù)來加載dll文件,因此在調(diào)用時(shí)不需對(duì)源文件做任何的修改,也正是如此奠定了這種方法的簡(jiǎn)單性。
一、linux
1. 準(zhǔn)備C語言程序,保存為add.c
#include <stdio.h> int add_int(int, int); float add_float(float, float); int add_int(int num1, int num2) { return num1 + num2; } float add_float(float num1, float num2) { return num1 + num2; }
2. 編譯成so庫
Ubuntu下執(zhí)行:gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c
3. 準(zhǔn)備python代碼,保存為python-c.py
import ctypes #load the shared object file adder = ctypes.cdll.LoadLibrary('./adder.so') #Find sum of integers res_int = adder.add_int(4,5) print("4 + 5 = " + str(res_int)) #Find sum of floats a = ctypes.c_float(5.5) b = ctypes.c_float(4.1) add_float = adder.add_float add_float.restype = ctypes.c_float print("5.5 + 4.1 = " + str(add_float(a, b)))
4. 測(cè)試
執(zhí)行:python3 python-c.py
結(jié)果如下:
4 + 5 = 9
5.5 + 4.1 = 9.600000381469727
5. 說明
在Python文件中,一開始先導(dǎo)入ctypes模塊,然后使用cdll.LoadLibrary
函數(shù)來加載我們創(chuàng)建的庫文件。這樣我們就可以通過變量adder來使用C類庫中的函數(shù)了。當(dāng)adder.add_int()被調(diào)用時(shí),內(nèi)部將發(fā)起一個(gè)對(duì)C函數(shù)add_int的調(diào)用。ctypes接口允許我們?cè)谡{(diào)用C函數(shù)時(shí)使用原生Python中默認(rèn)的字符串型和整型。
而對(duì)于其他類似布爾型和浮點(diǎn)型這樣的類型,必須要使用正確的ctype類型才可以。如向adder.add_float()函數(shù)傳參時(shí), 我們要先將Python中的十進(jìn)制值轉(zhuǎn)化為c_float類型,然后才能傳送給C函數(shù)。這種方法雖然簡(jiǎn)單,清晰,但是卻很受限。例如,并不能在C中對(duì)對(duì)象進(jìn)行操作。
二、windows
1. 準(zhǔn)備C語言程序,保存為add.c
同上
2. 編譯成dll庫
cygwin下執(zhí)行:gcc -shared -Wl,-soname,adder -o adder.dll -fPIC add.c
3. 準(zhǔn)備python代碼,保存為python-c.py
import ctypes #load the shared object file adder = ctypes.cdll.LoadLibrary('.\\adder.dll') #Find sum of integers res_int = adder.add_int(4,5) print("4 + 5 = " + str(res_int)) #Find sum of floats a = ctypes.c_float(5.5) b = ctypes.c_float(4.1) add_float = adder.add_float add_float.restype = ctypes.c_float print("5.5 + 4.1 = " + str(add_float(a, b)))
4. 測(cè)試
powershell下執(zhí)行: .\python-c.py
會(huì)出現(xiàn)以下錯(cuò)誤:
OSError: [WinError 126]
原因:adder.dll本身依賴其它庫,需要將這些庫一起復(fù)制到當(dāng)前目錄。
cygwin下執(zhí)行:ldd adder.dll
提示依賴以下庫
將這些庫copy到當(dāng)前目錄,執(zhí)行:cp xxx.dll .
powershell下再次執(zhí)行:.\python-c.py
結(jié)果如下:
總結(jié)
到此這篇關(guān)于python3調(diào)用c語言代碼的文章就介紹到這了,更多相關(guān)python3調(diào)用c語言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 給大家整理了19個(gè)pythonic的編程習(xí)慣(小結(jié))
- Python入門篇之編程習(xí)慣與特點(diǎn)
- 符合語言習(xí)慣的 Python 優(yōu)雅編程技巧【推薦】
- 只用20行Python代碼實(shí)現(xiàn)屏幕錄制功能
- Python一行代碼實(shí)現(xiàn)自動(dòng)發(fā)郵件功能
- 只需要100行Python代碼就可以實(shí)現(xiàn)的貪吃蛇小游戲
- 利用Python計(jì)算圓周率π的實(shí)例代碼
- 寫好Python代碼的幾條重要技巧
- Python 線程池模塊之多線程操作代碼
- python使用tkinter實(shí)現(xiàn)透明窗體上繪制隨機(jī)出現(xiàn)的小球(實(shí)例代碼)
- Python代碼風(fēng)格與編程習(xí)慣重要嗎?
相關(guān)文章
pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例
本文主要介紹了pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Python中aiohttp模塊的簡(jiǎn)單運(yùn)用方式
這篇文章主要介紹了Python中aiohttp模塊的簡(jiǎn)單運(yùn)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python中關(guān)于字典的常規(guī)操作范例以及介紹
今天小編幫大家簡(jiǎn)單介紹下Python的一種數(shù)據(jù)結(jié)構(gòu): 字典,字典是 Python 提供的一種常用的數(shù)據(jù)結(jié)構(gòu),它用于存放具有映射關(guān)系的數(shù)據(jù),通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09django應(yīng)用JWT(JSON?Web?Token)實(shí)戰(zhàn)教程
在前后端分離的項(xiàng)目中,JWT(JSON?Web?Token)作為一種廣泛使用的身份驗(yàn)證和授權(quán)機(jī)制,提供了一種安全、高效的方式來保護(hù)RESTful?API,本文詳細(xì)介紹了JWT的概念、優(yōu)勢(shì)、在Django中的應(yīng)用步驟和使用方法,是構(gòu)建安全、高效Web應(yīng)用的有效指南2024-10-10詳解Open Folder as PyCharm Project怎么添加的方法
這篇文章主要介紹了詳解Open Folder as PyCharm Project怎么添加的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12解決pygal.style的LightColorizedStyle參數(shù)問題
這篇文章主要介紹了解決pygal.style的LightColorizedStyle參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07