linux系统下调用动态库(.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可执行的.so文件
(1)gcc -c linuxany.c,将生成一个linuxany.o文件
(2)gcc -shared linuxany.c -o linuxany.so,将生成一个linuxany.so文件
3、在Python中调用
#!/usr/bin/python from ctypes import * import os //参数为生成的.so文件所在的绝对路径 libtest = cdll.Loadlibrary(os.getcwd() + '/linuxany.so') //直接用方法名进行调用 print libtest.display('Hello,I am linuxany.com') print libtest.add(2,2010)
4、运行结果
Hello,I am linuxany.com2012
windows下Python调用dll
python中如果要调用dll,需要用到ctypes模块,在程序开头导入模块 import ctypes
由于调用约定的不同,python调用dll的方法也不同,主要有两种调用规则,即 cdecl和stdcal,还有其他的一些调用约定,关于他们的不同,可以查阅其他资料
先说 stdcal的调用方法:
方法一:
import ctypesdll = ctypes.windll.Loadlibrary( 'test.dll' )
方法二:
import ctypesdll = ctypes.WinDll( 'test.dll' )
cdecl的调用方法:
1.
import ctypesdll = ctypes.cdll.Loadlibrary( 'test.dll' )##注:一般在linux下为test.o文件,同样可以使用如下的方法:## dll = ctypes.cdll.Loadlibrary('test.o')
2.
import ctypesdll = ctypes.CDll( 'test.dll' )
看一个例子,首先编译一个dll
导出函数如下:
# define ADD_EXPORT Q_DECL_EXPORTextern "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.addnumadd.argtypes=[ctypes.c_int,ctypes.c_int] #参数类型add.restypes=ctypes.c_int #返回值类型print add(1,2)get_path=dll.get_pathget_path.argtypes=[ctypes.c_char_p]path=create_string_buffer(100)get_path(path)print path.value
结果如下:
我们看到两个结果,第一个是进行计算,第二个是带回一个参数。
当然我们还可以很方便的使用windows的dll,提供了很多接口
GetSystemDirectory = windll.kernel32.GetSystemDirectoryAbuf = create_string_buffer(100)GetSystemDirectory(buf,100)print buf.valueMessageBox = windll.user32.MessageBoxWMessageBox(None,u"Hello World",u"Hi",0)
运行结果如下:
以上是内存溢出为你收集整理的Python在Windows和在Linux下调用动态链接库的教程全部内容,希望文章能够帮你解决Python在Windows和在Linux下调用动态链接库的教程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)