最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python在Windows和在Linux下调用动态链接库的教程

来源:懂视网 责编:小采 时间:2020-11-27 14:34:44
文档

Python在Windows和在Linux下调用动态链接库的教程

Python在Windows和在Linux下调用动态链接库的教程: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文件 (
推荐度:
导读Python在Windows和在Linux下调用动态链接库的教程: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文件 (
Linux系统下调用动态库(.so)

1、linuxany.c代码如下:

 #include "stdio.h"
 void display(char* msg){
 printf("%s
",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.com
2012 


Windows下Python调用dll

python中如果要调用dll,需要用到ctypes模块,在程序开头导入模块 import ctypes

由于调用约定的不同,python调用dll的方法也不同,主要有两种调用规则,即 cdecl和stdcal,还有其他的一些调用约定,关于他们的不同,可以查阅其他资料

先说 stdcal的调用方法:

方法一:

import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )

方法二:

import ctypes
dll = ctypes.WinDll( 'test.dll' )


cdecl的调用方法:

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' )

看一个例子,首先编译一个dll

导出函数如下:

# 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] #参数类型
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

结果如下:

2015818121733886.gif (368×95)

我们看到两个结果,第一个是进行计算,第二个是带回一个参数。

当然我们还可以很方便的使用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)

运行结果如下:

2015818121806575.gif (144×160)

文档

Python在Windows和在Linux下调用动态链接库的教程

Python在Windows和在Linux下调用动态链接库的教程: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文件 (
推荐度:
标签: linux 调用 python
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top