日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python调用C函数库

發布時間:2025/3/15 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python调用C函数库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python調用C函數庫

(2012-10-31 13:47:50) 轉載▼
標簽:

動態鏈接庫

c語言

so

ctypes

python

分類:Python

背景:工作中,有很多公共類庫是使用C語言實現的。雖然可以將之編譯成可執行的二進制文件,使用已熟知的commands模塊獲取shell命令行返回的結果;但是有些時候,所傳的參數中含有shell命令中需要轉義的字符(如,“$”),因此想到使用python直接調用C語言的函數庫,省去了對字符串中特殊字符進行轉義的麻煩。

.so文件的生成與使用

想要使用python調用C語言的函數,必須先將C程序編譯生成.so文件。生成.so文件需要使用“gcc?-shared”命令。

為了檢測生成的.so文件的可用性,可以編寫簡單的C語言測試代碼,常用的函數有:

void* handle = dlopen("xxx.so", RTLD_LAZY); ??//打開動態鏈接庫,并賦值給handle句柄,供后續使用

myfunc =?dlsym(handle, "func_name");? ? ?? ? ?? //獲取動態鏈接庫中的函數指針

dlclose(handle); //通過句柄關閉動態鏈接庫

ctypes模塊簡介

python中,ctypes模塊可以加載動態鏈接庫,使用時,需要首先“from ctypes import *”。

常用的函數有:

libc = cdll.LoadLibrary("xxx.so") ?#加載.so動態鏈接庫

libc.myfunc(...) ? ?? ? ?? ? ?? ? ?? ? ?#調用動態鏈接庫中的函數

另,因python與C語言中的數據類型不同,對于string類型,在調用C鏈接庫中的函數時,需要使用“c_char_p”對將字符串轉換為標準C中的char*類型。

注:ctypes不支持C++的數據類型(如,C++中的string等)。

附,python和C數據類型對照表:


實例

1、首先創建一個具有標準C數據類型的參數和返回值的函數(函數體中可以包含C++數據類型的元素)。

? ? ?為了避免C編譯器修改函數的名字,使用extern "C" 來聲明函數,如,

? ? ? 使用“nmxxx.so”命令可以查看xxx.so中的函數列表。

2、因python調用so動態鏈接庫出core時不便于調試,在生成so文件后,首先編寫一個簡單的test.c來檢測生成的.so文件的可用性:

3、編寫python腳本調用動態鏈接庫:

總結

以上是生活随笔為你收集整理的python调用C函数库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。