Python在Windows和在Linux下調(diào)用動(dòng)態(tài)鏈接庫的教程
Linux系統(tǒng)下調(diào)用動(dòng)態(tài)庫(.so)
1、linuxany.c代碼如下:
#include "stdio.h" void display(char* msg){ printf("%s\n",msg); } int add(int a,int b){ return a+b; }
2、編譯c代碼,最后生成Python可執(zhí)行的.so文件
(1)gcc -c linuxany.c,將生成一個(gè)linuxany.o文件
(2)gcc -shared linuxany.c -o linuxany.so,將生成一個(gè)linuxany.so文件
3、在Python中調(diào)用
#!/usr/bin/python from ctypes import * import os //參數(shù)為生成的.so文件所在的絕對路徑 libtest = cdll.LoadLibrary(os.getcwd() + '/linuxany.so') //直接用方法名進(jìn)行調(diào)用 print libtest.display('Hello,I am linuxany.com') print libtest.add(2,2010)
4、運(yùn)行結(jié)果
Hello,I am linuxany.com 2012
Windows下Python調(diào)用dll
python中如果要調(diào)用dll,需要用到ctypes模塊,在程序開頭導(dǎo)入模塊 import ctypes
由于調(diào)用約定的不同,python調(diào)用dll的方法也不同,主要有兩種調(diào)用規(guī)則,即 cdecl和stdcal,還有其他的一些調(diào)用約定,關(guān)于他們的不同,可以查閱其他資料
先說 stdcal的調(diào)用方法:
方法一:
import ctypes dll = ctypes.windll.LoadLibrary( 'test.dll' )
方法二:
import ctypes dll = ctypes.WinDll( 'test.dll' )
cdecl的調(diào)用方法:
1.
import ctypes dll = ctypes.cdll.LoadLibrary( 'test.dll' ) ##注:一般在linux下為test.o文件,同樣可以使用如下的方法: ## dll = ctypes.cdll.LoadLibrary('test.o')
2.
import ctypes dll = ctypes.CDll( 'test.dll' )
看一個(gè)例子,首先編譯一個(gè)dll
導(dǎo)出函數(shù)如下:
# define ADD_EXPORT Q_DECL_EXPORT extern "C" ADD_EXPORT int addnum(int num1,int num2) { return num1+num2; } extern "C" ADD_EXPORT void get_path(char *path){ memcpy(path,"hello",sizeof("hello")); }
這里使用的是cdecl
腳本如下:
dll=ctypes.CDLL("add.dll") add=dll.addnum add.argtypes=[ctypes.c_int,ctypes.c_int] #參數(shù)類型 add.restypes=ctypes.c_int #返回值類型 print add(1,2) get_path=dll.get_path get_path.argtypes=[ctypes.c_char_p] path=create_string_buffer(100) get_path(path) print path.value
結(jié)果如下:
我們看到兩個(gè)結(jié)果,第一個(gè)是進(jìn)行計(jì)算,第二個(gè)是帶回一個(gè)參數(shù)。
當(dāng)然我們還可以很方便的使用windows的dll,提供了很多接口
GetSystemDirectory = windll.kernel32.GetSystemDirectoryA buf = create_string_buffer(100) GetSystemDirectory(buf,100) print buf.value MessageBox = windll.user32.MessageBoxW MessageBox(None, u"Hello World", u"Hi", 0)
運(yùn)行結(jié)果如下:
- 用python實(shí)現(xiàn)一個(gè)簡單的驗(yàn)證碼
- Python利用Pillow(PIL)庫實(shí)現(xiàn)驗(yàn)證碼圖片的全過程
- python圖片驗(yàn)證碼識(shí)別最新模塊muggle_ocr的示例代碼
- Python實(shí)現(xiàn)驗(yàn)證碼識(shí)別
- 使用python創(chuàng)建生成動(dòng)態(tài)鏈接庫dll的方法
- python調(diào)用動(dòng)態(tài)鏈接庫的基本過程詳解
- ubuntu中python調(diào)用C/C++方法之動(dòng)態(tài)鏈接庫詳解
- Python調(diào)用易語言動(dòng)態(tài)鏈接庫實(shí)現(xiàn)驗(yàn)證碼功能
相關(guān)文章
Python實(shí)現(xiàn)計(jì)算最小編輯距離
這篇文章主要介紹了Python實(shí)現(xiàn)計(jì)算最小編輯距離的相關(guān)代碼,有需要的小伙伴可以參考下2016-03-03Python3中最常用的5種線程鎖實(shí)例總結(jié)
python3線程中鎖機(jī)制還是很重要的知識(shí)點(diǎn),如果大家不清楚鎖機(jī)制的話,那就一定要好好看下這篇文章,這篇文章主要給大家總結(jié)介紹了光宇Python3中最常用的5種線程鎖,需要的朋友可以參考下2021-07-07http請求 request失敗自動(dòng)重新嘗試代碼示例
這篇文章主要介紹了http請求 request失敗自動(dòng)重新嘗試代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01利用 Python 實(shí)現(xiàn)多任務(wù)進(jìn)程
這篇文章主要介紹如何利用 Python 實(shí)現(xiàn)多任務(wù)進(jìn)程,正在執(zhí)行的程序,由程序、數(shù)據(jù)和進(jìn)程控制塊組成,是正在執(zhí)行的程序,程序的一次執(zhí)行過程,是資源調(diào)度的基本單位。下面就來詳細(xì)介紹改內(nèi)容,需要的朋友可以參考一下2021-10-10Python+Opencv實(shí)現(xiàn)圖像匹配功能(模板匹配)
這篇文章主要為大家詳細(xì)介紹了Python+Opencv實(shí)現(xiàn)圖像匹配功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10