python调用C函数库
python調用C函數庫
(2012-10-31 13:47:50) 轉載▼標簽: 動態鏈接庫c語言soctypespython | 分類: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函数库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nature子刊 | 通过多组学手段系统
- 下一篇: 关于召开中国医药教育协会医学基因组学与生